您的位置:首页 > 其它

我的spfa (= =)!

2014-03-24 23:13 204 查看
从同学那里学的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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spfa 图的最短路