最短路 spfa, dijkstra, Floyd

spfa

 1 #include <stdio.h>
 2 #include <queue>
 3 using namespace std;
 4
 5 #define RANGE 101
 6 #define MAX 0x3f3f3f3f
 7 int cost[RANGE][RANGE];
 8 int d[RANGE];
 9 bool used[RANGE];
10 int n,m;
11
12 void spfa( int s )
13 {
14   int i,now;
15   // 初始化
16   for( i=1;i<=n;++i )
17   {
18     d[i]=MAX;
19     used[i]=false;
20   }
21
22   d[s]=0;
23   queue <int> q;
24   q.push(s);
25   used[s] = true;
26
27   while(!q.empty())
28   {
29     now = q.front();
30     q.pop();
31     used[now] = false;
32     for(i = 1; i <= n; i++)
33     {
34       if(d[i] > d[now] + cost[now][i])
35       {
36         d[i] = d[now] + cost[now][i];
37         if(used[i] == 0)
38         {
39           q.push(i);
40           used[i] = true;
41         }
42       }
43     }
44   }
45 }
46
47 int main()
48 {
49   int i,j,A,B,C;
50   while( scanf("%d%d",&n,&m) )
51   {
52     if( !n && !m )  break;
53     // 初始化
54     for( i=1;i<=n;++i )
55       for( j=1;j<=i;++j )
56         if( i==j )  cost[i][j]=0;
57         else    cost[i][j]=cost[j][i]=MAX;
58
59     for( i=0;i<m;++i )
60     {
61       scanf("%d%d%d",&A,&B,&C);
62       cost[A][B]=cost[B][A]=C;
63     }
64
65     spfa(1);
66     printf("%d\n",d[n]);
67   }
68   return 0;
69 }

dijkstra

 1 #include <stdio.h>
 2 #define MAX 0x3f3f3f3f
 3 #define RANGE 101
 4
 5 int cost[RANGE][RANGE];
 6 int d[RANGE];
 7 bool used[RANGE];
 8
 9 int n,m;
10 int Min( int a,int b )
11 {
12   return a<b?a:b;
13 }
14
15 void Dijkstra( int s )
16 {
17   int i,v,u;
18   for( i=1;i<=n;++i )
19   {
20     used[i]=false;
21     d[i]=cost[1][i];
22   }
23   d[s]=0;
24
25   while( true )
26   {
27     v=-1;
28     for( u=1;u<=n;++u )
29       if( !used[u] && ( v==-1 || d[u]<d[v]) )
30         v=u;
31     if( v==-1 ) break;
32     used[v]=true;
33
34     for( u=1;u<=n;++u )
35       d[u]=Min( d[u],d[v]+cost[v][u] );
36   }
37 }
38
39 int main()
40 {
41   int A,B,C,i,j;
42
43   while( scanf("%d%d",&n,&m) )
44   {
45     if( !n && !m )  break;
46
47     // 初始化
48     for( i=1;i<=n;++i )
49       for( j=1;j<=i;++j )
50         if( i==j )  cost[i][j]=0;
51         else    cost[i][j]=cost[j][i]=MAX;
52
53     for( i=0;i<m;++i )
54     {
55       scanf("%d%d%d",&A,&B,&C);
56       cost[A][B]=cost[B][A]=C;
57     }
58
59     Dijkstra(1);
60     printf("%d\n",d[n]);
61   }
62   return 0;
63 }

floyd

 1 #include <stdio.h>
 2 #define MAX 0x3f3f3f3f
 3 #define RANGE 105
 4
 5 int d[RANGE][RANGE];
 6 int n;
 7
 8 int Min( int a,int b )
 9 {
10   return a<b?a:b;
11 }
12 void warshall_floyd( void )
13 {
14   int i,j,k;
15   for( k=1;k<=n;++k )
16     for( i=1;i<=n;++i )
17       for( j=1;j<=n;++j )
18         d[i][j]=Min( d[i][j],d[i][k]+d[k][j] );
19 }
20
21 int main()
22 {
23   int m,A,B,C,i,j;
24
25   while( scanf("%d%d",&n,&m) )
26   {
27     if( !n && !m )  break;
28
29     // 初始化
30     for( i=1;i<=n;++i )
31       for( j=1;j<=i;++j )
32       {
33         if( i==j ) d[i][j]=0;
34         else    d[i][j]=d[j][i]=MAX;
35       }
36
37     // 输入
38     for( i=0;i<m;++i )
39     {
40       scanf("%d%d%d",&A,&B,&C);
41       d[A][B]=d[B][A]=C;
42     }
43
44     // floyd算法求最短路
45     warshall_floyd();
46     printf("%d\n",d[1][n]);
47   }
48   return 0;
49 }

时间: 2024-10-13 12:07:09

最短路 spfa, dijkstra, Floyd的相关文章

ACM-最短路(SPFA,Dijkstra,Floyd)之最短路——hdu2544

***************************************转载请注明出处:http://blog.csdn.net/lttree*************************************** 最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 28761    Accepted Submissio

uva 10099 The Tourist Guide(单源最短路/spfa/dijkstra)

题目: 链接:点击打开链接 题意: 思路: 代码: #include <iostream> #include <cstring> #include <cstdio> using namespace std; int map[101][101]; void floyd(int n) { for(int k=1; k<=n; k++) for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) map[i][j] = m

hdoj2544 最短路(Dijkstra || Floyd || SPFA)

题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2544 思路 最短路算法模板题,求解使用的Dijkstra算法.Floyd算法.SPFA算法可以当做求解最短路问题的模板使用. 代码 Dijkstra算法: 1 #include <algorithm> 2 #include <iostream> 3 #include <cstring> 4 #include <cstdio> 5 using namespace

hdu3665-Seaside(SPFA,dijkstra,floyd)

Seaside Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1369    Accepted Submission(s): 984 Problem Description XiaoY is living in a big city, there are N towns in it and some towns near the se

HDU - 2544 - 最短路 (最基础单源最短路问题!!dijkstra+floyd+SPFA)

最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 34617    Accepted Submission(s): 15001 Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找

dijkstra,SPFA,Floyd求最短路

Dijkstra: 裸的算法,O(n^2),使用邻接矩阵: 算法思想: 定义两个集合,一开始集合1只有一个源点,集合2有剩下的点. STEP1:在集合2中找一个到源点距离最近的顶点k:min{d[k]} STEP2:把顶点k加入集合1中,同时修改集合2中的剩余顶点j的d[j]是否经过k之后变短,若变短则修改d[j]; if d[k]+a[k,j]<d[j] then   d[j]=d[k]+a[k,j]; STEP3:重复STEP1,直到集合2为空为止. #include <iostream&

最短路(Dijkstra,Floyd,Bellman_Ford,SPFA)

当然,这篇文章是借鉴大佬的... 最短路算法大约来说就是有4种——Dijkstra,Floyd,Bellman_Ford,SPFA 接下来,就可以一一看一下... 1.Dijkstra(权值非负,适用于有向图及无向图,单源最短路) 1 Dijkstra's算法解决的是图中单个源点到其它顶点的最短路径.只能解决权值非负(看了代码就知道了)2 Dijkstral只能求出任意点到达源点的最短距离(不能求出任意两点之间的最短距离),同时适用于有向图和无向图,复杂度为O(n^2).3算法的过程: 1设置顶

最短路算法(dijkstra,bellman_ford,floyd)

最短路算法 dijkstra(初级的最短路算法,适合稠密图,可用邻接表优化) bool relax(int u,int v) { double tmp=max(dist[u],edge[u][v]); if(tmp<dist[v]){ dist[v]=tmp; } } void dijkstra() { memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++){ int x; double mindist=INF; for(int j=0;j<n;j

HDU 2544:最短路( 最短路径入门 &amp;&amp;Dijkstra &amp;&amp; floyd )

最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 30972    Accepted Submission(s): 13345 Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找

ACM:最短路,dijkstra,邻接表的建立,使用邻接表跟优先队列的dijkstra,Bellman-Ford,Floyd。。

(一)dijkstra,邻接矩阵 所有边权均为正,不管有没有环,求单个源点出发,到所有节点的最短路.该方法同时适用于有向图和无向图. #include <iostream> #include <string> #include <stack> using namespace std; const int MAXN = 1000; const int INF = 100000000; int n, m; int maze[MAXN][MAXN], vis[MAXN], d