#include <cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn=1e9;
int n,m,tol,hed[10000],dis[10000],vis[10000],cnt[10000];
struct node
{
int f;
int t;
int v;
int next;
} edge[2*10000];
queue<int>q;
int SPFA(int s)
{
while(!q.empty())
{
q.pop();
}
for(int i=1; i<=n; i++)
{
dis[i]=maxn;
vis[i]=0;
cnt[i]=0;
}
dis[s]=0;
vis[s]=1;
q.push(s);
while(!q.empty())
{
int temp=q.front();
q.pop();
vis[temp]=0;
for(int i=hed[temp]; i!=-1; i=edge[i].next)
{
int e=edge[i].t;
if(dis[e]>dis[temp]+edge[i].v)
{
dis[e]=dis[temp]+edge[i].v;
if(!vis[e])
{
if(++cnt[e]==n)
return 0;
vis[e]=1;
q.push(e);
}
}
}
}
return 1;
}
void addedge(int f,int t,int v)
{
edge[tol].t=t;
edge[tol].f=f;
edge[tol].v=v;
edge[tol].next=hed[f];
hed[f]=tol++;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
tol=1;
memset(hed,-1,sizeof(hed));
for(int i=1; i<=m; i++)
{
int f,t,v;
scanf("%d%d%d",&f,&t,&v);
addedge(f,t,v);
addedge(t,f,v);
}
if(!SPFA(1))
printf("NO\n");
else
{
for(int i=1; i<=n; i++)
{
printf("%d %d\n",i,dis[i]);
}
}
}
return 0;
}
SPFA算法
最新推荐文章于 2023-12-25 22:46:13 发布