比赛 防止浮躁的小练习V0.1 评测结果 AAAAAAAAA
题目名称 最长路 最终得分 100
用户昵称 SOBER GOOD BOY 运行时间 0.032 s
代码语言 C++ 内存使用 0.90 MiB
提交时间 2016-10-07 16:47:58
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<deque>
using namespace std;
 
const int maxn=1510;
const int maxm=50010;
 
int N,M,len=0,vis[maxn];
 
struct Edge
{
	int dis,to,next;
}e[maxm];
 
 bool flag[maxn];
 
int head[maxn],dis[maxn];
 
void ADD(int x,int y,int z)
{
	len++;
	e[len].to=y;
	e[len].next=head[x];
	e[len].dis=z;
	head[x]=len;
}
 
void spfa()
{
	dis[1]=0;
	deque<int> q;
	q.push_front(1);
	flag[1]=1;
	while(!q.empty())
	{
		int x=q.front();flag[x]=0;
		q.pop_front();
	
		for(int t,i=head[x];i;i=e[i].next)
		{//puts("OK");
			t=e[i].to;
			if(dis[t]>dis[x]+e[i].dis)
			{
				dis[t]=dis[x]+e[i].dis;
				if(!flag[t])
				{
					flag[t]=1;
					vis[t]++;
					if(vis[t]>N+1){puts("-1");return;}
					if(!q.empty()&&dis[q.front()]>dis[t])q.push_front(t);
					else q.push_back(t);
				}
			}
		}
	}	
		
	if(dis[N]!=dis[0])
	printf("%d",-dis[N]);
	else printf("-1");
}
 
int main()
{
	freopen("longest.in","r",stdin);
	freopen("longest.out","w",stdout);
	scanf("%d%d",&N,&M);
	for(int x,y,z,i=1;i<=M;i++)scanf("%d%d%d",&x,&y,&z),ADD(x,y,-z);
	memset(dis,0x7f/2,sizeof(dis));
	spfa();
	fclose(stdin);
	fclose(stdout);
	return 0;
}