POJ 1679The Unique MST
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
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! 题意: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的更多相关文章
- POJ - 1679_The Unique MST
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Description Given a connected undirected grap ...
- poj 1679 The Unique MST
题目连接 http://poj.org/problem?id=1679 The Unique MST Description Given a connected undirected graph, t ...
- POJ 1679 The Unique MST (最小生成树)
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 22668 Accepted: 8038 D ...
- poj 1679 The Unique MST(唯一的最小生成树)
http://poj.org/problem?id=1679 The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submis ...
- poj 1679 The Unique MST 【次小生成树】【模板】
题目:poj 1679 The Unique MST 题意:给你一颗树,让你求最小生成树和次小生成树值是否相等. 分析:这个题目关键在于求解次小生成树. 方法是,依次枚举不在最小生成树上的边,然后加入 ...
- poj 1679 The Unique MST (判定最小生成树是否唯一)
题目链接:http://poj.org/problem?id=1679 The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total S ...
- POJ 1679 The Unique MST (最小生成树)
The Unique MST 题目链接: http://acm.hust.edu.cn/vjudge/contest/124434#problem/J Description Given a conn ...
- poj 1679 The Unique MST【次小生成树】
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 24034 Accepted: 8535 D ...
- POJ 1679:The Unique MST(次小生成树&&Kruskal)
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 19941 Accepted: 6999 D ...
随机推荐
- java文件配置MySQL
MybatisConfig.java文件 import com.alibaba.druid.pool.DruidDataSource; import com.xman.common.mybatis.S ...
- python 为 class 添加新的属性和方法
通过继承: >>> class Point(namedtuple('Point', ['x', 'y'])): ... __slots__ = () ... @property .. ...
- Leetcode114. Flatten Binary Tree to Linked List二叉树展开为链表
给定一个二叉树,原地将它展开为链表. 例如,给定二叉树 1 / \ 2 5 / \ \ 3 4 6 将其展开为: 1 \ 2 \ 3 \ 4 \ 5 \ 6 class Solution { publ ...
- CentOS如何升级openssl到最新版本
本文不再更新,可能存在内容过时的情况,实时更新请移步原文地址:CentOS如何升级openssl到最新版本: 环境信息 CentOS Linux release 7.6.1810 (Core): Op ...
- 记一次PHP 数组基本用法
以前不知道PHP数组可以这样叠加. $b = array( '2' => 'zhang', ); $a = array( ' => 'li' ) + $b; print_r($a); $b ...
- linux bash算术运算
+, -, *(乘), /(除), **(乘方), %(取模) let var=算术运算符表达式 var=$[算术运算符表达式] var=$((算术运算符表达式)) var=$(expr $ARG1 ...
- How To Install Nginx on CentOS 7(转)
How To Install Nginx on CentOS 7 PostedJuly 22, 2014 427.4kviews NGINX CENTOS About Nginx Nginx is a ...
- Appium_Python_Client介绍
一.Appium_Python_Client介绍 Appium的实用方法都藏在Client的源码里,对于driver和webelement实例,均有对应的元素查找方法(webelement查找的是下面 ...
- java-Map-system
一 概述 0--星期日1--星期一... 有对应关系,对应关系的一方是有序的数字,可以将数字作为角标. public String getWeek(int num){ if(num<0 || n ...
- day37 10-SH整合的案例练习
<set name="orders" cascade="delete"> 如果没有在Customer.hbm.xml中配置级联删除,删除客户的时候默 ...