UVa 10000 Longest Paths

天下第一好大人 2012-04-29 05:19:57
原文地址:
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=941

开始我是用dfs做的,超时。
然后看了网上的提示说是用BellmanFord算法,负权的最短路径。写了如下代码,可是总WA。
谁给个容易出错的case?或者有AC代码借我看看?谢谢!


#include <stdio.h>
#include <string.h>

int g[101][101];
int d[101];
int t, n, s, p, q, f, l;

void BellmanFord()
{
for( int i = 1; i <= n; ++i ) d[i] = g[s][i];

bool isChanged = true;

for( int k = 2; (k < n) && isChanged; ++k )
{
isChanged = false;
for( int i = 1; i <= n; ++i )
{
for( int j = 1; j <= n; ++j )
{
if( g[j][i] && d[i] > d[j] + g[j][i] )
{
d[i] = d[j] + g[j][i];
isChanged = true;
}
}
}
}
}

int main() {
for( t = 1; scanf( "%d", &n ), n; ++t ) {
for( int i = 1; i <= n; ++i ) for( int j = 1; j <= n; ++j ) g[i][j] = 0;
memset( d, 0, sizeof(int) * (n+1) );
scanf( "%d", &s );
for( ;scanf( "%d %d", &p, &q ), p|q; ) g[p][q] = -1;
BellmanFord();
l = 1; f = s;
for( int i = 1; i <= n; ++i ) if( d[i] < l ) { l = d[i]; f = i; }
printf( "Case %d: The longest path from %d has length %d, finishing at %d.\n\n",
t, s, -l, f );
}
return 0;
}
...全文
1018 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
BellmanFord最内部的判断条件应改为if( g[j][i] && d[j] && d[i] > d[j] + g[j][i] )

必须保证两条边都是可达的,才行。

33,010

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧