图结构练习——最短路径
Time Limit: 1000MS Memory limit: 65536K
题目描述
给定一个带权无向图,求节点1到节点n的最短路径。
输入
输入包含多组数据,格式如下。
第一行包括两个整数n m,代表节点个数和边的个数。(n<=100)
剩下m行每行3个正整数a b c,代表节点a和节点b之间有一条边,权值为c。
输出
每组输出占一行,仅输出从1到n的最短路径权值。(保证最短路径存在)
示例输入
3 2 1 2 1 1 3 1 1 0
示例输出
1 0
提示
Floyd算法的基本思想如下:
从任意节点A到任意节点B的最短路径不外乎2种可能,
1是直接从A到B,
2是从A经过若干个节点到B,
所以,我们假设dis(AB)为节点A到节点B的最短路径的距离,对于每一个节点K,我们检查dis(AK) + dis(KB) < dis(AB)是否成立,如果成立,那我们就松弛dis,那就是 dis(AB) = dis(AK) + dis(KB),这样一来,当我们遍历完所有节点K,dis(AB)中记录的便是A到B的最短路径的距离。
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #define N 102
- #define MAX_N 0x3f3f3f3f
- int a[N][N];
- int main()
- {
- int n,m,i,j;
- int s,b,c;
- while(~scanf("%d %d",&n,&m))
- {
- for(i = 1; i <= n ; i++) //初始化
- {
- for(j = 1; j <= n; j++)
- {
- if(i == j)
- a[i][j] = 0;
- else
- a[i][j] = MAX_N;
- }
- }
- for( i = 1 ; i <= m ; i++ )
- {
- scanf("%d %d %d",&s,&b,&c);
- if(a[s][b]>c) //存最小的边
- {
- a[s][b] = c;
- a[b][s] = c;
- }
- }
- for(int k = 1; k <= n ; k++) //Floyd算法的核心
- {
- for(i = 1; i<= n; i++)
- {
- for(j = 1; j<= n ; j++)
- {
- if(a[i][j] > a[i][k]+a[k][j])
- a[i][j] = a[i][k]+a[k][j];
- }
- }
- }
- printf("%d\n",a[1][n]);
- }
- return 0;
- }
Dijkstra算法
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #define N 102
- #define MAX_N 0x3f3f3f3f
- int a[N][N];
- int book[N],dis[N];
- int main()
- {
- int n,m,i,j;
- int s,b,c,k,l;
- while(~scanf("%d %d",&n,&m))
- {
- for(i = 1; i <= n ; i++)
- {
- for(j = 1; j <= n; j++)
- {
- if(i == j)
- a[i][j] = 0;
- else
- a[i][j] = MAX_N;
- }
- }
- for( i = 1 ; i <= m ; i++ )
- {
- scanf("%d %d %d",&s,&b,&c);
- if(a[s][b] > c)
- {
- a[s][b] = c;
- a[b][s] = c;
- }
- }
- for(i = 1; i <= n ; i++)
- {
- dis[i] = a[1][i];
- }
- for(i = 1; i <= n ; i++)
- {
- book[i] = 0;
- }
- book[1] = 1;
- for( i = 1 ; i <= n-1 ; i++ )
- {
- int min = MAX_N;
- for( j = 1 ; j <= n ; j ++ )
- {
- if(book[j] == 0 && dis[j] < min)
- {
- min =dis[j];
- k = j;
- }
- }
- book[k] = 1;
- for( l = 1 ; l <= n ; l ++ )
- {
- if( a[k][l] < MAX_N )
- {
- if(dis[l] > dis[k] + a[k][l])
- dis[l] = dis[k] + a[k][l];
- }
- }
- }
- printf("%d\n",dis[n]);
- }
- return 0;
- }
代码菜鸟,如有错误,请多包涵!!