判断一个无向连通图的MST是否唯一,其实本质上就是求是否存在次小树恰好等于MST。
   16ms碾过~ 数据弱,不建议用来测试模版,据说有非SST做法,kuskal + LCA + O(E) ?求大神教学……

 1 /*
 2 Problem: 1679        User: _mTy
 3 Memory: 760K        Time: 16MS
 4 Language: G++        Result: Accepted
 5
 6 Source Code
 7 */
 8
 9 # include<cstdio>
10 # include<cstdlib>
11 # include<cstring>
12 # include<queue>
13 # define N 101
14 using namespace std;
15
16 struct nod{
17     int u , max ;
18 };
19 int g[N][N];
20 int tree[N][N];
21 int best[N][N];
22
23 int prim(int n , int fa[]);
24
25 int main(){
26     int t , n , m;
27     int i , j , u , v , w , t1 , total;
28     int fa[N];
29     struct nod tmp , arr[N * N];
30     bool unique , visi[N];
31     scanf( " %d " ,& t);
32      while (t -- ){
33         scanf( " %d%d " ,& n ,& m);
34          for (i = 0 ;i < n;i ++ for (j = 0 ;j < n;j ++ ) g[i][j] = 0x7fffffff ;
35         memset(tree ,- 1 , sizeof (tree));
36          for (i = 0 ;i < m;i ++ ){
37             scanf( " %d%d%d " ,& u ,& v ,& w);
38             g[u - 1 ][v - 1 ] = g[v - 1 ][u - 1 ] = w;
39         }
40         t1 = prim(n , fa);
41          for (i = 0 ;i < n;i ++ ) tree[i][fa[i]] = tree[fa[i]][i] = g[i][fa[i]];
42
43          //  bfs
44         total = 0 ;
45         memset(best ,- 1 , sizeof (best));
46          for (i = 0 ;i < n;i ++ ){
47             memset(visi , 0 , sizeof (visi));
48             arr[total] . u = i; arr[total] . max =- 1 ;
49             queue < struct nod >  _que; _que . push(arr[total]);  ++ total;
50             visi[i] = 1 ;
51              while ( ! _que . empty ()){
52                 tmp  =  _que . front(); _que . pop();
53                  for (v = 0 ;v < n;v ++ )
54                      if ! visi[v]  &&  tree[tmp . u][v] !=- 1  ){
55                        visi[v] = 1 ;
56                        best[i][v] =
57                                 (tmp . max < tree[tmp . u][v]) ? tree[tmp . u][v] : tmp . max ;
58                        arr[total] . max = best[i][v];
59                        arr[total] . u = v;
60                        _que . push(arr[total]);
61                         ++ total;
62                     }
63             }
64         }
65         unique  =   1 ;
66          for (i = 0 ;i < n;i ++ )
67              for (j = i + 1 ;j < n;j ++ )
68                  if ( g[i][j] != 0x7fffffff   &&  tree[i][j] ==- 1  )
69                      if ( t1  -  best[i][j]  +  g[i][j]  ==  t1 ) unique  =   0 ;
70
71          if ( unique )  printf ( " %d\n " , t1);
72          else   printf ( " Not Unique!\n " );
73
74     }
75
76      return   0 ;
77 }