很容易推出如果是五向边,那么这些构成环,现在就是要找怎么改变一些边的方向使之在有向图的时候也构成环,显然只需要对一个方向进行搜索,找相反方向边的权值和。然后再与另一方向的进行比较(通过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;
}