Bellman

来源:互联网 发布:端口镜像是做什么用的 编辑:程序博客网 时间:2024/06/03 21:33

原网址点击打开链接

#include<cstdio>#include<algorithm>#include<iostream>#include<cstring>#include<cmath>#define MAX 1005#define inf 1<<20using namespace std;int N,M,K;//K为起点,共N个节点,M条边struct stu{    int u;//起点    int v;//终点    int cost;};int lowcost[MAX];int pre[MAX];stu edge[MAX];bool BF(){    for(int i=1; i<=N; i++)    {        lowcost[i]=inf;    }    lowcost[K]=0;    bool flag=1;    for(int i=2; i<=N; i++)    {        for(int j=1; j<=M; j++)        {            if(lowcost[edge[j].v]>lowcost[edge[j].u]+edge[j].cost)            {                lowcost[edge[j].v]=lowcost[edge[j].u]+edge[j].cost;                pre[edge[j].v]=edge[j].u;            }        }    }    for(int j=1; j<=M; j++)//二次松弛,因为所存已经是最短路径,理论上无法松弛,        //如果松弛成功,证明存在负环    {        if(lowcost[edge[j].v]>lowcost[edge[j].u]+edge[j].cost)        {            flag=0;            break;        }    }    return flag;}int main(){    while(scanf("%d%d",&N,&M)!=EOF)    {        cin>>K;        for(int i=1; i<=M; i++)        {            cin>>edge[i].u>>edge[i].v>>edge[i].cost;        }        if(BF())        {//此处我们就默认输入K为1开始输出,哈哈,偷个小懒            for(int i=2;i<=N;i++)            {                cout<<lowcost[i]<<endl;            }        }    }    return 0;}

最后因为是转载,这个博主应该是建立了自己的网站,很是羡慕啊,最近我也一直在思考创建一个自己的小小网站来作为一个自主分享的平台,感谢这位博主,让我对建立网站又多了一些小小的参考和想法

原创粉丝点击