您的位置:首页 > 其它

2544 最短路 Dijkstra算法 Floyd算法 Bellman_Ford算法 SPFA算法

2010-11-18 21:53 447 查看
Dijkstra算法 Floyd_warshall算法 Bellman_Ford算法

源 单源 多源 单源

时间复杂度 n2(n个点) n3 VE

负权值 No Yes Yes

Dijkstra算法

#include <stdio.h>
#define N 101
#define MAX 0x7ffffff//不要设成最大值 否者会加出负数
int n;
int mark
;
int map

;
int path
;//存放1到n的最短路
void dij(int v)
{
int min,i,j,k,dis;
for (i=1;i<=n;i++)
{
path[i]=map[v][i];
mark[i]=0;
}
mark[1]=1;
for (i=2;i<=n;i++)
{
min=MAX;
k=v;
for (j=2;j<=n;j++)
{
if (!mark[j] && path[j]<min)//在未mark点中,找到1点到此点路径最短的那个点k
{
min=path[j];
k=j;
}
}
mark[k]=1;
for (j=2;j<=n;j++)
{
dis=map[k][j]+path[k];//加进k点后修改最短路径
if (!mark[j] && dis<path[j] )
{
path[j]=dis;
}
}
}
}
int main ()
{
//freopen("1.txt","r",stdin);
int i,j,u,v,cost,m;
while(scanf("%d%d",&n,&m),n||m)
{
for (i=1;i<=n;i++)//初始化
{
for (j=1;j<=n;j++)   map[i][j]=MAX;
}
for (i=0;i<m;i++)
{
scanf("%d%d%d",&u,&v,&cost);
map[u][v]=map[v][u]=cost;
}
dij(1);
printf("%d/n",path
);
}
}


6 7
1 2 5
1 3 6
2 4 7
3 5 2
2 5 1
4 6 4
5 6 3

等于9 1->2->5->6

Floyd_warshall算法

#include <stdio.h>
#define N 101
#define INF 0x7ffffff
int n;
int map

;
int min(int a,int b)
{
return a<b? a:b;
}
void floyd()//folyd算法
{
int i,j,k;
for (k=1;k<=n;k++)
{
for (i=1;i<=n;i++)
{
for (j=1;j<=n;j++)
{
map[i][j]=min(map[i][j],map[i][k]+map[k][j]);
}
}
}
}
int main ()
{
//freopen("1.txt","r",stdin);
int i,j,u,v,cost,m;
while(scanf("%d%d",&n,&m),n||m)
{
for (i=1;i<=n;i++)
{
for (j=1;j<=n;j++)
{
map[i][j]=INF;
}
}
while(m--)
{
scanf("%d%d%d",&u,&v,&cost);
map[u][v]=map[v][u]=cost;
}
floyd();
printf("%d/n",map[1]
);
}
}


Bellman_Ford算法

http://hi.baidu.com/%B0%AE%D0%C4%CD%AC%C3%CB_%B3%C2%F6%CE/blog/item/0302d1d8db40b43d33fa1ceb.html

http://www.nocow.cn/index.php/Bellman-Ford%E7%AE%97%E6%B3%95

#include <stdio.h>
#define N 10005
struct
{
int s,e,w;//start end weight
}t
;
int d[101];
void Bellman_Ford(int n,int m)
{
int i,j;
d[1]=0;//起点初始化为0 其他的的全部初始化为infinity
for (i=2;i<=n;i++)   d[i]=0x7ffffff;
for (i=1;i<n;i++)//迭代n-1次
{
for (j=0;j<m;j++)//m条边
{
if (d[t[j].s]+t[j].w<d[t[j].e])  d[t[j].e]=d[t[j].s]+t[j].w;
if (d[t[j].e]+t[j].w<d[t[j].s])  d[t[j].s]=d[t[j].e]+t[j].w;//双向
}
}
}
int main ()
{
//freopen("2544.txt","r",stdin);
int n,m,i;
while(scanf("%d%d",&n,&m),n||m)
{
for (i=0;i<m;i++)  scanf("%d%d%d",&t[i].s,&t[i].e,&t[i].w);
Bellman_Ford(n,m);
printf("%d/n",d
);
}
}


SPFA算法 就是Bellman_Ford做成优先队列

优先队列 0MS

stl queue 15MS

SPFA+DFS 15MS

#include<stdio.h>
#include<string.h>
#include <map>
#include <queue>
#define _clr(a)  memset(a,0,sizeof(a))
using namespace std;
#define N 101
int d
;
int n,m;
map<int,int>  head
;// head[u][v]=w
void spfa(int st)  //start
{
int i;
int u,v,w;
map<int,int>::iterator it;
queue<int> q;
//起点初始化为0 其他的的全部初始化为infinity
for (i=1;i<=n;i++)   d[i]=0x7ffffff;
d[st]=0;
q.push(st);
while(!q.empty())
{
u=q.front();
q.pop();
for (it=head[u].begin();it!=head[u].end();it++)
{
v=it->first;
w=it->second;
if (d[u]+w<d[v])
{
d[v]=d[u]+w;
q.push(v);
}
}
}
}
int main()
{
//freopen("2544.txt","r",stdin);
map<int,int>::iterator it;
int i;
int u,v,w;
int cnt
;
while(scanf("%d%d",&n,&m),n||m)
{

_clr(cnt);
for (i=0;i<m;i++)
{
scanf("%d%d%d",&u,&v,&w);
head[u][v]=head[v][u]=w;
}
spfa(1);
for (i=0;i<n;i++)  head[i].clear();
printf("%d/n",d
);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐