实验一 弗洛伊德算法
实验目的:弗洛伊德算法求最短路径
实验内容:
- #include <stdio.h>
- void main()
- {
- int e[9][9],k,i,j,n,m,t1,t2,t3;
- int inf=99999999; //用inf(infinity的缩写)存储一个我们认为的正无穷值
- scanf("%d %d",&n,&m);//读入n和m,n表示顶点个数,m表示边的条数
- //初始化
- for(i=1;i<=n;i++)
- for(j=1;j<=n;j++)
- if(i==j) e[i][j]=0;
- else e[i][j]=inf;
- //读入边
- for(i=1;i<=m;i++)
- {
- scanf("%d %d %d",&t1,&t2,&t3);
- e[t1][t2]=t3;
- }
- for(k=1;k<=n;k++)
- for(i=1;i<=n;i++)
- for(j=1;j<=n;j++)
- if(e[i][j]>e[i][k]+e[k][j] )
- e[i][j]=e[i][k]+e[k][j];
- for(i=1;i<=n;i++)
- {
- for(j=1;j<=n;j++)
- {
- printf("%10d",e[i][j]);
- }
- printf("\n");
- }
-
- }
复制代码 /* 测试数据 n=4 m=5
边的数据
1 2 5
1 3 6
2 3 1
2 4 4
3 4 4
输出结果
0 5 6 9
99999999 0 1 4
99999999 99999999 0 4
99999999 99999999 99999999 0
*/
实验一 迪杰斯特拉算法
实验目的:迪杰斯特拉算法求最短路径
实验内容:
- #include<stdio.h>
- #define SIZE 110
- #define INF 1000000;
- int map[SIZE][SIZE]; //邻接矩阵存储
- int len[SIZE]; //d[i]表示源点到i这个点的距离
- int visit[SIZE]; //节点是否被访问
- int n,m;
- int dijkstra(int from, int to)//从源点到目标点
- {
- int i;
- for(i = 1 ; i <= n ; i ++)//初始化
- {
- visit[i] = 0; //一开始每个点都没被访问
- len[i] = map[from][i]; //先假设源点到其他点的距离
- }
- int j;
- for(i = 1 ; i < n ; ++i)//对除源点的每一个点进行最短计算
- {
- int min = INF; //记录最小len[i]
- int pos; //记录小len[i] 的点
- for(j = 1 ; j <= n ; ++j)
- {
- if(!visit[j] && min > len[j])
- {
- pos = j;
- min = len[j];
- }
- }
- visit[pos] = 1;
- for(j = 1 ; j <= n ; ++j)
- {
- if(!visit[j] && (len[j] > (len[pos] +map[pos][j])))
- { //如果j节点没有被访问过&&j节点到源节点的最短路径>pos节点到源节点的最短路径+pos节点到j节点的路径
- len[j] = len[pos] + map[pos][j]; //更新j节点到源节点的最短路径
- }
- }
- }
- return len[to];
- }
- int main ()
- {
- int i,j;
- // scanf("%d%d",&n,&m); //输入数据
- n = 6; //测试数据
- m = 9;
- for(i = 1 ; i <= n ; ++i)
- { //设一开始每个点都不可达
- for(j = 1 ; j <= n ; ++j)
- {
- map[i][j] = INF;
- }
- }
- /* int a,b,c; //输入数据
- for(i = 1 ; i <= m ; ++i)
- {
- scanf("%d%d%d",&a,&b,&c);
- map[a][b] = map[b][a] = c;
- } */
- map[1][2] = 5; //测试数据
- map[1][3] = 8;
- map[1][6] = 3;
- map[1][4] = 7;
- map[2][3] = 4;
- map[3][6] = 9;
- map[4][6] = 6;
- map[5][6] = 1;
- map[4][5] = 5;
- map[3][4] = 5;
- int temp = INF;
- for(i = 1 ; i <= n ; ++i)
- {
- for(j = 1 ; j <= n ; ++j)
- {
- if(map[i][j] == temp)
- map[i][j] = map[j][i];
- }
- }
- int ans = dijkstra(1,5);
- printf("%d",ans);
- return 0;
- }
复制代码 /* 边的数据
1 2 5
1 3 8
1 6 3
1 4 7
2 3 4
3 6 9
5 6 1
4 5 5
3 4 5
*/
【必读】版权免责声明
1、本主题所有言论和内容纯属会员个人意见,与本论坛立场无关。2、本站对所发内容真实性、客观性、可用性不做任何保证也不负任何责任,网友之间仅出于学习目的进行交流。3、对提供的数字内容不拥有任何权利,其版权归原著者拥有。请勿将该数字内容进行商业交易、转载等行为,该内容只为学习所提供,使用后发生的一切问题与本站无关。 4、本网站不保证本站提供的下载资源的准确性、安全性和完整性;同时本网站也不承担用户因使用这些下载资源对自己和他人造成任何形式的损失或伤害。 5、本网站所有软件和资料均为网友推荐收集整理而来,仅供学习用途使用,请务必下载后两小时内删除,禁止商用。6、如有侵犯你版权的,请及时联系我们(电子邮箱1370723259@qq.com)指出,本站将立即改正。
|
|