您的位置:首页 > 其它

SDUTOJ(2143)图结构练习——最短路径

2018-02-28 22:13 555 查看

图结构练习——最短路径

Time Limit: 1000 ms Memory Limit: 65536 KiB [align=center]Submit Statistic Discuss [/align]

Problem Description

 给定一个带权无向图,求节点1到节点n的最短路径。  

Input

 输入包含多组数据,格式如下。 第一行包括两个整数n m,代表节点个数和边的个数。(n<=100)剩下m行每行3个正整数a b c,代表节点a和节点b之间有一条边,权值为c。 

Output

 每组输出占一行,仅输出从1到n的最短路径权值。(保证最短路径存在)  

Sample Input

3 2
1 2 1
1 3 1
1 0

Sample Output

1
0

Hint

 

Source

 赵利强 
解题思路:弗洛伊德算法O(N的立方)的时间复杂度。

AC代码:#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;

int D[1000][1000];

void Init_Gra(int n)
{
int i, j;
for(i = 0; i<=n; i++)
{
for(j = 0; j<=n; j++)
{
if(i != j)
{
D[i][j] = INF;
}
else
{
D[i][j] = 0;
}
}
}
}

void Floyd(int n)
{
int i, j, k;
for(i = 0; i <= n; i++)
{
for(j = 0; j <= n; j++)
{
for(k = 0; k <= n; k++)
{
if(D[j][k] > D[j][i] + D[i][k])
{
D[j][k] = D[j][i] + D[i][k];
}
}
}
}
}

int main()
{
int n, m, a, b, c;
while(~scanf("%d %d", &n, &m))
{
Init_Gra(n);//初始化
while(m--)
{
scanf("%d %d %d", &a, &b, &c);
if(D[a][b] > c) //去重取最小
{
D[a][b] = D[b][a] = c;
}
}
Floyd(n);//弗洛伊德算法
printf("%d\n", D
[1]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: