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;
}
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;
}
相关文章推荐
- 3. Spring Boot热部署【从零开始学Spring Boot】
- [jvm解析系列][三]Java的垃圾回收(一)如何鉴别垃圾,四种引用类型
- Python学习笔记 —— 逻辑语句
- CentOS7手动释放内存
- sql 面试题
- Login学习2
- com.android.dex.DexIndexOverflowException
- 跟随屏幕大小自动调整bitmap大小(横竖屏拍摄的照片均可)
- linux网络协议栈内核分析
- DexIndexOverflowException: Cannot merge new index 65772 into a non-jumbo instruction
- 少贪便宜
- 【Java】majorityElement
- MarkDown环境的配置-mac
- 解决InvalidDataAccessApiUsageException: Executing an update/delete query
- Mysql空值与非
- IK分词器 整合solr4.7 含同义词、切分词、停止词
- c++关于函数的按值传递和按址传递
- 中间件的简要概述
- 获取手机分辨率(屏幕大小)
- hdu5652 India and China Origins(并查集联通)