标签:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 21706 | Accepted: 7676 |
Description
Input
Output
Sample Input
2 3 3 1 2 1 2 3 2 3 1 3 4 4 1 2 2 2 3 2 3 4 2 4 1 2
Sample Output
3 Not Unique!
直接用krusual来做。。。
先做一次最小。。然后记录n-1条边。。
在求n-1次 , 次小生成树。
求完次小注意一下要判一下是否有 n-1条边
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> using namespace std ; typedef long long LL ; const int N = 110; const int M = 11000; struct edge { int u , v , w ; bool operator < ( const edge &a ) const { return w < a.w ; } }e[M]; int n , m , fa[N] , cnt ; bool vis[M] ; int find( int k ) { return k == fa[k] ? k : find(fa[k]); } int mst( int ban ) { int ans = 0 ; cnt = 0 ; for( int i = 0 ; i <= n ; ++i ) fa[i] = i ; for( int i = 0 ; i < m ; ++i ) { int fu = find( e[i].u ) , fv = find( e[i].v ); if( fu == fv || i == ban ) continue ; fa[fv] = fu; ans += e[i].w ; if( ban == -1 ) vis[i] = true ; cnt++ ; } return ans ; } void Work() { sort( e , e + m ); memset( vis , false , sizeof vis ); int ans = mst( -1 ); for( int i = 0 ; i < m ; ++i ) if( vis[i] ) { if( mst(i) == ans && cnt == n - 1 ) { cout << "Not Unique!" << endl ; return ; } } cout << ans << endl ; } int main () { // freopen("in.txt","r",stdin); int _ ; cin >> _ ; while( _-- ) { cin >> n >> m ; for( int i = 0 ; i < m ; ++i ) { cin >> e[i].u >> e[i].v >> e[i].w ; } Work(); } }
POJ 1679 The Unique MST(次小生成树)
标签:
原文地址:http://www.cnblogs.com/hlmark/p/4291460.html