Lightoj 1049 DFS

来源:互联网 发布:发通知用知悉还是悉知 编辑:程序博客网 时间:2024/05/15 23:13

很容易推出如果是五向边,那么这些构成环,现在就是要找怎么改变一些边的方向使之在有向图的时候也构成环,显然只需要对一个方向进行搜索,找相反方向边的权值和。然后再与另一方向的进行比较(通过sum来减直接求得),即可得出答案。

AC代码如下:

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int weight[101][101];bool mark[101];int sum, N;int flag = 1;int DFS( int pos, int pre ){mark[pos] = true;if( flag == 0 && pos == 1 ){return 0;}for( int i = 1; i <= N; i++ ){if( ( pos != 1 && i == 1 && i != pre && weight[pos][i] != 0 ) || ( weight[pos][i] != 0 && !mark[i] && i != pre ) ){flag = 0;return DFS( i, pos );}}for( int i = 1; i <= N; i++ ){if( ( pos != 1 && i == 1 && i != pre && weight[i][pos] != 0 ) || ( weight[i][pos] != 0 && !mark[i] && i != pre ) ){flag = 0;return weight[i][pos] + DFS( i, pos );}}}int main(){int T, Case = 1;cin >> T;while( T-- ){cin >> N;sum = 0;memset( mark, false, sizeof( mark ) );memset( weight, 0, sizeof( weight ) );for( int i = 0; i < N; i++ ){int temp1, temp2, temp3;cin >> temp1 >> temp2 >> temp3;weight[temp1][temp2] = temp3;sum += temp3;}flag = 1;int ans = DFS( 1, 0 );cout << "Case " << Case++ << ": " << min( ans, sum - ans ) << endl;}return 0;}


 

0 0
原创粉丝点击