比赛 |
防止浮躁的小练习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;
}