我的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;
}
#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模板
- (简单) POJ 2240 Arbitrage,SPFA。
- sgu 240 Runaway (spfa)
- ACM学习感悟——POF3255 (用SPFA求次短路)
- 【POJ3268】Silver Cow Party【spfa】
- HDU3768 Shopping(状态压缩DP+spfa)旅行商问题
- 最短路SPFA 算法详解
- SPFA单源最短路径
- hdu 4568 spfa 最短路算法+旅行商问题
- poj 1847 Tram 【最短路 dijkstra + floyd + spfa】
- poj 3259 Wormholes(spfa)
- cdoj915-方老师的分身 II (长度不小于k的最短路)【spfa】
- 【最短路】poj1847 SPFA或Floyd
- POJ Wormholes (SPFA)
- 基础最短路(模板 spfa)
- hdu1874(最短路:一道题学习Floyd,Dijkstra,Bellman-Ford,SPFA)
- Uva 11324 The Largest Clique【强连通 DAG动规 spfa】
- [hdu1317]spfa
- POJ3621 sightseeing cows 01分数规划+SPFA判定
- HDU 1874:畅通工程续【Dijkstra & SPFA & Floyd】