萌新刚学OI,求助连样例都过不了的dij
查看原帖
萌新刚学OI,求助连样例都过不了的dij
298549
SIXIANG32楼主2020/7/6 15:38

我也不知道我胆子有多肥去写dij紫题

#include<iostream>
#include<queue>
#include<cstring>
#include<vector>
#include<climits>
#include<algorithm> 
#define int long long
using namespace std;
const int MAXN=1000101;
int dis[MAXN];
bool vis[MAXN];
int inq[MAXN];
struct node{
    int id;
    int dist;
    node(int id_, int dist_):id(id_),dist(dist_){}
    bool operator < (const node &other) const
    {
        return other.dist < dist;
    }
};
struct edge{
    int to,val;
    edge(int to_,int val_):
    to(to_),val(val_){}
};
vector<edge>gra[MAXN];
vector<int>pre[MAXN];
//这上面都是数据定义 
void link(int x,int y,int v)
{
	gra[x].push_back(edge(y,v));
}
priority_queue<node>q;
void dijkstra(node s)
{
    q.push(s);
    while(!q.empty())
    {
        node temp = q.top();
        q.pop();
        if(vis[temp.id]) continue;
        vis[temp.id]=1;
        //下面是正常的dij 
        for(int i=0;i<gra[temp.id].size();i++)
        {
            if(dis[temp.id]+gra[temp.id][i].val<dis[gra[temp.id][i].to])
            {
                dis[gra[temp.id][i].to] = dis[temp.id] + gra[temp.id][i].val;
                if(!vis[gra[temp.id][i].to])
                    q.push(node(gra[temp.id][i].to,dis[gra[temp.id][i].to]));
            }
        }
        int k=temp.id;
        //下面是解除结界 
        for(int p=0;p<pre[k].size();p++)
        {
        	inq[pre[k][p]]--;
        	if(inq[pre[k][p]]==0&&dis[pre[k][p]]!= 0x3f)//结界没了 
        		dis[pre[k][p]]=max(dis[k],dis[pre[k][p]]);
		}
    }
}
signed main()
{
    int n,m,s,x,y,z;
    cin>>n>>m;
    for(int p=1;p<=m;p++)
    {
        cin>>x>>y>>z;
       	link(x,y,z);
    }
    for(int p=1;p<=n;p++)
    {
    	cin>>inq[p];
    	for(int i=1,x;i<=inq[p];i++)
    	{
    		cin>>x;
    		pre[p].push_back(x);
		}
	}
    memset(dis, 0x3f, sizeof dis);
    dis[s]=0;
    dijkstra(node(s, 0));
    cout<<dis[n]<<endl;
    return 0;
}

求助QwQ,样例输出不明东东

2020/7/6 15:38
加载中...