判断一个无向连通图的MST是否唯一,其实本质上就是求是否存在次小树恰好等于MST。
16ms碾过~ 数据弱,不建议用来测试模版,据说有非SST做法,kuskal + LCA + O(E) ?求大神教学……
1/*
2Problem: 1679 User: _mTy
3Memory: 760K Time: 16MS
4Language: G++ Result: Accepted
5
6Source Code
7*/
8
9#include<cstdio>
10#include<cstdlib>
11#include<cstring>
12#include<queue>
13#define N 101
14using namespace std;
15
16struct nod{
17 int u,max;
18};
19int g[N][N];
20int tree[N][N];
21int best[N][N];
22
23int prim(int n,int fa[]);
24
25int 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}