SPFA算法

来源:互联网 发布:软件教育现代化期刊 编辑:程序博客网 时间:2024/05/13 11:23
#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;}

0 0
原创粉丝点击