您的位置:首页 > 其它

HDU 2544 最短路(Dijkstra和Floyd)

2012-06-15 09:07 543 查看
题目链接

非常裸的最短路问题,昨天把Dijkstra的思想理解了下,发现和prim非常相似,都是用一个low数组记录到达每个点的最短距离,昨天WA了N次,发现数据中竟然有两个点的权值有的时候有好几个。。。杭电上这个题数据没有重边。

今天看了一下弗洛伊德,代码真的是挺简单,思想不是很理解。。。先代码实现,然后慢慢体会他的DP思路。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 100000
int p[111][111],o[101],low[101];
int main()
{
int n,m,i,j,k,sv,ev,w,min;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n == 0&&m == 0) break;
memset(o,0,sizeof(o));
for(i = 1; i <= n; i ++)
for(j = 1; j <= n; j ++)
{
if(j != i)
p[i][j] = N;
else
p[i][j] = 0;
}
for(i = 1; i <= m; i ++)
{
scanf("%d%d%d",&sv,&ev,&w);
if(p[sv][ev] > w)
p[sv][ev] = w;
if(p[sv][ev] > w)
p[ev][sv] = w;
}
for(i = 1; i <= n; i ++)
{
low[i] = p[1][i];
}
o[1] = 1;
for(i = 2; i <= n-1; i ++)
{
min = N;
for(j = 1; j <= n; j ++)
{
if(min > low[j]&&o[j] == 0)
{
min = low[j];
k = j;
}
}
o[k] = 1;
for(j = 1; j <= n; j ++)
{
if(low[j] > min + p[k][j]&&o[j] == 0)
{
low[j] = min +p[k][j];
}
}
}
printf("%d\n",low
);
}
return 0;
}

弗洛伊德O(n^3)


#include <stdio.h>
#include <string.h>
#define N 1000000
int p[101][101];
int main()
{
int n,m,i,j,k,sv,ev,w;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n == 0&&m == 0)
break;
memset(p,0,sizeof(p));
for(i = 0;i <= n;i ++)
for(j = 0;j <= n;j ++)
{
if(i == j)
p[i][j] = 0;
else
p[i][j] = N;
}
for(i = 1;i <= m;i ++)
{
scanf("%d%d%d",&sv,&ev,&w);
if(p[sv][ev] > w)
{
p[sv][ev] = w;
p[sv][ev] = w;
p[ev][sv] = w;
p[ev][sv] = w;
}
}
for(i = 1;i <= n;i ++)
for(j = 1;j <= n;j ++)
for(k = 1;k <= n;k ++)
{
if(p[j][k] > p[j][i] + p[i][k])//注意这个状态转移方程
p[j][k] = p[j][i] + p[i][k];
}
printf("%d\n",p[1]
);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: