您的位置:首页 > 其它

POJ 1502 Dijkstra最短路水题

2013-09-25 00:35 316 查看
睡前无聊,水了一题

莫名其妙地就AC了

连我自己都觉得自己写得很有问题(感觉思路很乱)

比如说其他n-1个过程机全部得由第一个来连(是不是我题目看错了?),那这个就是错的

好吧再复习下Dijkstra

循环n次(n个点)

过程1,找到未访问的值最小的点,找到后将其标记为已访问

过程2,更新与该点相关的周围的点

下面附上水人的代码

#include <cstring>
#include <cstdio>
#include <algorithm>
#define MAX 120
#define INF 100000000
using namespace std;
int G[MAX][MAX], d[MAX];
bool vis[MAX];
char st[120];
int atoi(char* s)
{
int ans = 0;
for(int i = 0; i < strlen(s); i++)
{
ans *= 10; ans += (s[i] - '0');
}
return ans;
}
int main()
{
int n, temp, sd, node;
scanf("%d", &n);
memset(vis, 0, sizeof(vis));
for(int i = 1; i <= n; i++) G[i][i] = -1;
for(int i = 2; i <= n; i++)
{
for(int j = 1; j <= i - 1; j++)
{
scanf("%s", st);
if(st[0] == 'x') G[i][j] = G[j][i] = -1;
else G[i][j] = G[j][i] = atoi(st);
}
}
int res;
memset(vis, 0, sizeof(vis));
for(int j = 1; j <= n; j++) d[j] = INF;
d[1] = 0; sd = INF;
for(int j = 1; j <= n; j++)
{
node = 0; sd = INF;
for(int k = 1; k <= n; k++)
if(!vis[k] && sd > d[k]) {node = k; sd = d[k];}
if(!node) break;
vis[node] = true;
for(int k = 1; k <= n; k++)
if(!vis[k] && G[node][k] != -1 && d[k] > d[node] + G[node][k])
d[k] = d[node] + G[node][k];

}
int mx = -1;
for(int j = 1; j <= n; j++) if(d[j] > mx) mx = d[j];
res = mx;
printf("%d\n", res);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: