Description
Given a connected undirected graph, tell if its minimum spanning tree is unique. 
Definition 1 (Spanning Tree): Consider a connected, undirected graph G = (V, E). A spanning tree of G is a subgraph of G, say T = (V', E'), with the following properties: 
1. V' = V. 
2. T is connected and acyclic. 
Definition 2 (Minimum Spanning Tree): Consider an edge-weighted, connected, undirected graph G = (V, E). The minimum spanning tree T = (V, E') of G is the spanning tree that has the smallest total cost. The total cost of T means the sum of the weights on all the edges in E'. 


Input

The first line contains a single integer t (1 <= t <= 20), the number of test cases. Each case represents a graph. It begins with a line containing two integers n and m (1 <= n <= 100), the number of nodes and edges. Each of the following m lines contains a triple (xi, yi, wi), indicating that xi and yi are connected by an edge with weight = wi. For any two nodes, there is at most one edge connecting them.


Output

For each input, if the MST is unique, print the total cost of it, or otherwise print the string 'Not Unique!'.


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! 题意:t组测试数据,n个点,m条边,求最小生成树是否唯一。唯一则输出最小生成树的边劝和,否则输出Not Unque!。 没打过次小生成树,然后乱搞一通,似乎数据很水,莫名其妙的过掉了?!!
代码:
//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=100+10,maxm=maxn*maxn;
int T,n,m,ans,mi[12]; int aa;char cc;
int read() {
aa=0;cc=getchar();
while(cc<'0'||cc>'9') cc=getchar();
while(cc>='0'&&cc<='9') aa=aa*10+cc-'0',cc=getchar();
return aa;
} struct Line{
int x,y,z;bool usd;
}li[maxm]; bool cmp(const Line& a,const Line& b) {return a.z<b.z;} int fa[maxn][12];
int find(int x) {return fa[x][0]==x? x:fa[x][0]=find(fa[x][0]);} int fir[maxn],nxt[2*maxn],to[2*maxn],e=0,v[2*maxn];
void add(int x,int y,int z) {
to[++e]=y;nxt[e]=fir[x];fir[x]=e;v[e]=z;
to[++e]=x;nxt[e]=fir[y];fir[y]=e;v[e]=z;
} void Kr() {
int tot=0,xx,yy; ans=0;
for(int i=1;i<=n;++i) fa[i][0]=i;
for(int i=1;i<=m&&tot<n;++i) {
xx=find(li[i].x);yy=find(li[i].y);
if(xx==yy) continue;
fa[xx][0]=yy; ans+=li[i].z;
li[i].usd=1; tot++;
add(li[i].x,li[i].y,li[i].z);
}
memset(fa,0,sizeof(fa));
} int d[maxn],f[maxn][12];
void dfs(int pos,int dep) {
d[pos]=dep;int y,z;
for(y=fir[pos];y;y=nxt[y]) {
if((z=to[y])==fa[pos][0]) continue;
f[z][0]=v[y]; fa[z][0]=pos;
dfs(z,dep+1);
}
} bool work(int x,int y,int z) {
if(d[x]!=d[y]) {
if(d[x]<d[y]) swap(x,y);
int cha=d[x]-d[y];
for(int i=10;i>=0&&cha;--i) if(cha>=mi[i]) {
if(f[x][i]==z) return 1;
cha-=mi[i];x=fa[x][i];
}
}
if(x==y) return 0;
for(int i=10;i>=0;--i) if(fa[x][i]!=fa[y][i]) {
if(f[x][i]==z||f[y][i]==z) return 1;
x=fa[x][i];y=fa[y][i];
}
if(f[x][1]==z||f[y][1]==z) return 1;
return 0;
} int main() {
T=read(); mi[0]=1; bool ok;
for(int i=1;i<=10;++i) mi[i]=mi[i-1]*2;
while(T--) {
n=read();m=read();ok=0;e=0;
memset(fir,0,sizeof(fir));
memset(f,0,sizeof(f));
for(int i=1;i<=m;++i) {
li[i].x=read();
li[i].y=read();
li[i].z=read();
li[i].usd=0;
}
sort(li+1,li+m+1,cmp);
Kr(); dfs(1,1);f[1][0]=1e9;
for(int i=1;i<=10;++i) for(int j=1;j<=n;++j) {
fa[j][i]=fa[fa[j][i-1]][i-1];
f[j][i]=max(f[j][i-1],f[fa[j][i-1]][i-1]);
}
for(int i=1;i<=m;++i) if(!li[i].usd&&work(li[i].x,li[i].y,li[i].z)) {
printf("Not Unique!\n");
ok=1; break;
}
if(!ok) printf("%d\n",ans);
}
return 0;
}

  

 
 

POJ 1679The Unique MST的更多相关文章

  1. POJ - 1679_The Unique MST

    The Unique MST Time Limit: 1000MS Memory Limit: 10000K Description Given a connected undirected grap ...

  2. poj 1679 The Unique MST

    题目连接 http://poj.org/problem?id=1679 The Unique MST Description Given a connected undirected graph, t ...

  3. POJ 1679 The Unique MST (最小生成树)

    The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 22668   Accepted: 8038 D ...

  4. poj 1679 The Unique MST(唯一的最小生成树)

    http://poj.org/problem?id=1679 The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submis ...

  5. poj 1679 The Unique MST 【次小生成树】【模板】

    题目:poj 1679 The Unique MST 题意:给你一颗树,让你求最小生成树和次小生成树值是否相等. 分析:这个题目关键在于求解次小生成树. 方法是,依次枚举不在最小生成树上的边,然后加入 ...

  6. poj 1679 The Unique MST (判定最小生成树是否唯一)

    题目链接:http://poj.org/problem?id=1679 The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total S ...

  7. POJ 1679 The Unique MST (最小生成树)

    The Unique MST 题目链接: http://acm.hust.edu.cn/vjudge/contest/124434#problem/J Description Given a conn ...

  8. poj 1679 The Unique MST【次小生成树】

    The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 24034   Accepted: 8535 D ...

  9. POJ 1679:The Unique MST(次小生成树&amp;&amp;Kruskal)

    The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 19941   Accepted: 6999 D ...

随机推荐

  1. [转]SQLserver字符串分割函数

    一.按指定符号分割字符串,返回分割后的元素个数,方法很简单,就是看字符串中存在多少个分隔符号,然后再加一,就是要求的结果. CREATE function Get_StrArrayLength ( ) ...

  2. 901. Online Stock Span [短于线性的时间统计单个元素的Span ]

    Span 指这个元素之前连续的小于这个元素的值有多少个 原理: 维护递减栈 这个栈内的元素是递减的序列 新到一个元素x 依次出栈比x小的(也就是这个元素的Span) 这种问题的关键在于 新来的元素如果 ...

  3. numpy 常用工具函数 —— np.bincount/np.average

    numpy 常用工具函数 —— np.bincount/np.average numpy 常用api(一) numpy 常用api(二) 一个函数提供 random_state 的关键字参数(keyw ...

  4. TZOJ 5962 Happy Matt Friends(计数DP)

    描述 Matt hzs N friends. They are playing a game together. Each of Matt’s friends has a magic number. ...

  5. Phone List HDU1671 字典树Trie

    模板题...不过会爆内存,要小心 #include <iostream> #include <cstdio> #include <string.h> #pragma ...

  6. istio1.1(openshift) 流量路由

    1.准备测试应用 准备两个nginx Pod和一个proxy 创建应用 apiVersion: apps.openshift.io/v1 kind: DeploymentConfig metadata ...

  7. linux下C++遍历文件夹下的全部文件;Windows/Linux下C++批量修改文件名,批量删除文件

    Linux下 C++遍历目录下所有文件 rename(image_path.c_str(), image_path_new.c_str()); remove(image_path_move.c_str ...

  8. 深度优先搜索(Depth-First-Search)精髓

    引例:迷宫问题 首先我们来想象一只老鼠,在一座不见天日的迷宫内,老鼠在入口处进去,要从出口出来.那老鼠会怎么走?当然可以是这样的:老鼠如果遇到直路,就一直往前走,如果遇到分叉路口,就任意选择其中的一条 ...

  9. Log4j---文件解析以及语法使用

    Log4j------是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件,甚至是套接口服务器.NT的事件记录器.UNIX Syslog守护进程 ...

  10. 洛谷P2258 子矩阵[2017年5月计划 清北学堂51精英班Day1]

    题目描述 给出如下定义: 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与列的相对顺序)被称为原矩阵的一个子矩阵. 例如,下面左图中选取第2.4行和第2.4.5列交叉位置的元素 ...