标签:des blog java strong 数据 art
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 29737 Accepted Submission(s): 12833
最短路的一道模板题吧,但我WA了好多次了,不是因为别的,粗心大意,把i和j给敲错了。
dijkstra算法就是从一个节点找到到其他节点最短的路,然后再以这个最短的节点为起点,找到到其他节点的路,如果找过的,就不用再找了。思想很简单吧。
贴出代码:
#include <stdio.h>
#define maxn 0x3f3f3f3
int map[105][105], dis[105], visited[105];
int Dijkstra(int start, int finish)
{
int mind, mark;
for(int i = 1; i<=finish; i++) //查找之前的初始化
{
dis[i] = map[start][i];
visited[i] = 0;
}
visited[start] = 1; //标记已经找过的
for(int i = 1; i<=finish; i++) //从中找出那个未找过的最短
{
mind = maxn;
for(int j = 1; j<=finish; j++)
{
if(mind > dis[j] && !visited[j])
{
mind = dis[j];
mark = j;
}
}
visited[mark] = 1;
for(int j = 1; j<=finish; j++) //以这个为起点,再来找。
{
if(!visited[j] && dis[j] > dis[mark]+map[mark][j])
dis[j] = dis[mark]+map[mark][j];
}
}
return dis[finish];
}
int main()
{
int n, m;
int distance;
int a, b, c;
while(scanf("%d%d", &n, &m)!=EOF && (n!=0 && m!=0))
{
for(int i = 1; i<=n; i++)
{
for(int j = 1; j<=n; j++)
map[i][j] = maxn;
}
for(int i = 1; i<=m; i++)
{
scanf("%d%d%d", &a, &b, &c);
map[a][b] = c;
map[b][a] = c;
}
distance = Dijkstra(1, n);
printf("%d\n", distance);
}
return 0;
}
标签:des blog java strong 数据 art
原文地址:http://www.cnblogs.com/fengxmx/p/3836653.html