sdoi 2010大陆争霸

传送门

#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;
 } 

猜你喜欢

转载自blog.csdn.net/qq_35152804/article/details/87951047