【模板】SPFA

来源:互联网 发布:北京大学医学网络教育 编辑:程序博客网 时间:2024/06/06 15:03

1.BFS

/*  *******************  *******************    HDU 2544 最短路  *******************  ********************/#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<climits>#include<string>#include<queue>#include<stack>#include<algorithm>using namespace std;#define rep(i,j,k)for(i=j;i<k;i++)#define per(i,j,k)for(i=j;i>k;i--)#define MS(x,y)memset(x,y,sizeof(x))typedef long long LL;const int INF=0x7ffffff;const int M=100+1;int mp[M][M];int dis[M];int vis[M];int i,j,k,n,m;void spfa(){    queue<int>q;    int u;    q.push(1);    dis[1]=0;    while(!q.empty())    {        u=q.front();        q.pop();        vis[u]=0;        for(i=1;i<=n;i++)            if(dis[i]>dis[u]+mp[u][i]){                dis[i]=dis[u]+mp[u][i];                if(!vis[i])                    vis[i]=1,q.push(i);            }    }}int main(){    while(~scanf("%d%d",&n,&m),n+m)    {        for(i=1;i<=n;i++)         for(j=1;j<=n;j++){            mp[i][j]=INF;            dis[i]=INF;            vis[i]=0;        }        for(i=0;i<m;i++){            int a,b,c;            scanf("%d%d%d",&a,&b,&c);            mp[a][b]=mp[b][a]=c;        }        spfa();        printf("%d\n",dis[n]);    }    return 0;}

2.数组

/*  *******************  *******************  HDU 1874 畅通工程续  *******************  ********************/#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<climits>#include<string>#include<queue>#include<stack>#include<algorithm>using namespace std;#define rep(i,j,k)for(i=j;i<k;i++)#define per(i,j,k)for(i=j;i>k;i--)#define MS(x,y)memset(x,y,sizeof(x))typedef long long LL;const int INF= 100000000;const int M=200+1;int mp[M][M];int dis[M];int vis[M];int q[M];int i,j,k,n,m,sx,ex;void spfa(){    dis[sx]=0;vis[sx]=1;    int f,k,u;    q[0]=sx;f=0;k=1;    while(f<k)    {        u=q[f];        for(i=0;i<n;i++){            if(dis[i]>dis[u]+mp[u][i]){                dis[i]=dis[u]+mp[u][i];                if(!vis[i]){                    q[k++]=i;                    vis[i]=1;                }            }        }        vis[u]=0;        f++;    }}int main(){    while(~scanf("%d%d",&n,&m))    {        for(i=0;i<n;i++)          for(j=0;j<n;j++){            mp[i][j]=INF;            dis[i]=INF;            q[i]=vis[i]=0;        }        for(i=0;i<m;i++){            int a,b,c;            scanf("%d%d%d",&a,&b,&c);            if(c<mp[a][b])mp[a][b]=mp[b][a]=c;        }        scanf("%d%d",&sx,&ex);        spfa();        if(dis[ex]<INF)printf("%d\n",dis[ex]);        else puts("-1");    }    return 0;}


0 0
原创粉丝点击