33,010
社区成员
发帖
与我相关
我的任务
分享
#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;
}