您的位置:首页 > 其它

UVA 10000 - Longest Paths

2016-06-04 15:23 405 查看
题意:给出一个图和图上的边,求最长路径。

hint:图中无回路。

#include <iostream>
#include <cstring>

using namespace std;

int maps[105][105];
int used[105];
int topo[105];
int times[105];

int Count;
void dfs( int s, int n )
{
for ( int i = 1 ; i <= n ; ++ i )
if ( !used[i] && maps[s][i] ) {
used[i] = 1;
dfs( i, n );
}
topo[Count ++] = s;
}

void topological( int s, int n )
{
for ( int i = 1 ; i <= n ; ++ i ) {
used[i] = 0;
times[i] = -10005;
}
times[s] = 0;
used[s] = 1;
Count = 0;
dfs( s, n );

int Max = s;
for ( int i = Count-1 ; i >= 0 ; -- i )
for ( int j = Count-1 ; j > i ; -- j ) {
int a = topo[i],b = topo[j];
if ( maps[b][a] && times[a] <= times[b] + 1 ) {
times[a] = times[b] + 1;
if ( times[Max] == times[a] && a < Max )
Max = a;
else if ( times[Max] < times[a] )
Max = a;
}
}

cout<<times[Max]<<", finishing at "<<Max<<"."<<endl;
cout <<endl;
}

int main()
{
int n,s,p,q,t = 1;
while (cin >> n && n ) {
cin >> s;
memset( maps, 0, sizeof(maps) );
while ( cin >> p >> q && p+q )
maps[p][q] = 1;

cout << "Case "<<t++<<": The longest path from "<< s <<" has length ";
topological( s, n );
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: