#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
long long nxt[100001],to[100001],head[100001],val[100001];
long long tot=0;
void add(long long u,long long v,long long w)
{
tot++;
nxt[tot]=head[u];
head[u]=tot;
val[tot]=w;
to[tot]=v;
return;
}
long long n,m;
long long baohu[100001];
long long num=0;
long long nt[100001],he[100010],t[100001];
void add1(long long u,long long v)
{
num++;
nt[num]=he[u];
he[u]=num;
t[num]=v;
return;
}
priority_queue<pair<int,int> >q;
long long f[10001];
long long d[10001];
long long k[10001];
bool vis[10001];
void dijkstra()
{
memset(f,127/3,sizeof(f));
memset(d,127/3,sizeof(d));
q.push(make_pair(0,1));
d[1]=0;
f[1]=0;
while(!q.empty())
{
long long now=q.top().second;
q.pop();
if(vis[now])continue;
vis[now]=1;
for(long long i=head[now];i;i=nxt[i])
{
long long v=to[i];
if(f[now]+val[i]<d[v])
{
d[v]=f[now]+val[i];
if(!baohu[v])
{
f[v]=max(k[v],d[v]);
q.push(make_pair(-f[v],v));
}
}
}
for(long long i=he[now];i;i=nt[i])
{
long long v=t[i];
baohu[v]--;
k[v]=max(k[v],f[now]);
if(!baohu[v])
{
f[v]=max(k[v],d[v]);
q.push(make_pair(-f[v],v));
}
}
}
printf("%lld",f[n]);
return;
}
int main()
{
scanf("%lld%lld",&n,&m);
for(long long i=1;i<=m;i++)
{
long long u,v,w;
scanf("%lld%lld%lld",&u,&v,&w);
add(u,v,w);
}
for(long long i=1;i<=n;i++)
{
long long x;
scanf("%lld",&x);
for(long long j=1;j<=x;j++)
{
long long v;
scanf("%lld",&v);
baohu[i]++;
add1(v,i);
}
}
dijkstra();
return 0;
}
sdoi 2010大陆争霸
猜你喜欢
转载自blog.csdn.net/qq_35152804/article/details/87951047
今日推荐
周排行