我的spfa (= =)!

来源:互联网 发布:留学新加坡 知乎 编辑:程序博客网 时间:2024/05/24 13:28

从同学那里学的spfa,只不过改了几个我常用的变量名,加了几句评论,就成我的东西!呵呵,赶脚自己是小偷,在偷技术!哈哈,不过他要是来问我的话,我也会毫无保留的跟他说的,我们要跟国际接轨,要有开源精神!下面给出spfa的一般代码,具体变量作用在代码中略有解释!

#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<queue>using namespace std;const int maxn=10005;const int INF=0x3f3f3f3f;int g[maxn][maxn];int vis[maxn],dis[maxn];queue<int > que;void init(){    memset(g,INF,sizeof(g));    for(int i=0;i<maxn;i++)g[i][i]=0;}void spfa(int from,int to,int n){    memset(vis,0,sizeof(vis));    memset(dis,INF,sizeof(dis));    dis[from]=0;    que.push(from);    while(!que.empty()){        int x=que.front();        que.pop();        vis[x]=1;        for(int y=1;y<=n;y++){    //枚举连接x点所有点            if(g[x][y]==INF)continue;            if(dis[x]<INF&&dis[y]>dis[x]+g[x][y]){     //更新到from的最短路;                dis[y]=dis[x]+g[x][y];                if(!vis[y]){           //剪枝,看他们是否已经在队列中;                    que.push(y);                    vis[y]=1;                }            }        }    }    //for(int i=0;i<=n;i++)printf("%d : %d\n",i,dis[i]);}int main(){    int n,m;    while(~scanf("%d%d",&n,&m)){        init();        int from ,to,len;        for(int i=0;i<m;i++){            scanf("%d%d%d",&from ,&to,&len);            if(len<g[from][to])                g[from][to]=g[to][from]=len;        }        scanf("%d%d",&from,&to);        spfa(from ,to, n);        printf("%d \n",dis[to]);    }    return 0;}


0 0