我也不知道我胆子有多肥去写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,样例输出不明东东