给定M条边N个点的带权(有正有负)有向图。求 1 到 N 的最短路,如果 1 无法到达 N 输出 -1。不存在负环。
题目测试点能过一部分,有些RE有些WA
#include<bits/stdc++.h>
using namespace std;
const int N = 5e5 + 5;
int n,m,cnt,dis[N],vis[N],head[N];
struct inf
{
int to,len,nxt;
}edge[N];
queue<int> q;
void add(int u,int v,int w)
{
cnt ++;
edge[cnt].to = v;
edge[cnt].len = w;
edge[cnt].nxt = head[u];
head[u] = cnt;
}
void spfa(int s)
{
memset(dis,0x3f,sizeof dis);
dis[s] = 0;
vis[s] = 1;
q.push(s);
while(q.empty() == 0)
{
int now = q.front();
q.pop();
for(int i = head[now];i != 0;i = edge[i].nxt)
{
int t = edge[i].to;
dis[t] = min(dis[t],dis[now] + edge[i].len);
if(vis[t] == 0)
{
vis[t] = 1;
q.push(t);
}
}
}
}
int main()
{
scanf("%d %d",&n,&m);
for(int i = 1;i <= m;i ++)
{
int u,v,len;
scanf("%d %d %d",&u,&v,&len);
add(u,v,len);
}
spfa(1);
if(dis[n] > 0x3f3f3f3f / 2)
{
printf("-1");
return 0;
}
printf("%d",dis[n]);
return 0;
}//QWQ