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 ...
随机推荐
- 13 个最佳 JavaScript 数据网格库
13 个最佳 JavaScript 数据网格库 转自:开源中国 www.oschina.net/translate/best-javascript-data-grid-libraries Java ...
- PAT甲级——A1037 Magic Coupon
The magic shop in Mars is offering some magic coupons. Each coupon has an integer N printed on it, m ...
- 《数据结构与算法分析——C语言描述》ADT实现(NO.01) : 栈(Stack)
这次的数据结构是一种特殊的线性表:栈(Stack) 栈的特点是后入先出(LIFO),可见的只有栈顶的一个元素. 栈在程序中的地位非常重要,其中最重要的应用就是函数的调用.每次函数调用时都会创建该函数的 ...
- Device eth0 does not seem to be present, delaying initialization(VM虚拟机restart service出现此错误)
>从vmware workstation中克隆(clone)了一个redhat6.0的虚拟机,启动之后发现网卡没有启动.于是重启一下network服务,发现提示错误信息“Device eth0 ...
- Power Strings POJ2406 KMP 求最小循环节
相比一般KMP,构建next数组需要多循环一次,因为next[j]代表前j-1个字符的最长相同前缀后缀,比如字符串为aab aab aab共9个字符,则next[10]等于前9个字符中最长相同前缀后缀 ...
- LA3905 Meteor
https://vjudge.net/problem/UVALive-3905 计算出每个点在相框中的时间段,扫描线做即可 关键在如何快速计算每个点在相框中的时间段.对每个点进行运动分解,进入的时间L ...
- element ui table 去掉边框
// /deep/ .el-table { // thead { // .cell { // text-align: left; // table 表头 左对齐 // } // } // .delet ...
- Ionic JPush极光推送 插件实例
1.需要去这里注册https://www.jiguang.cn 注册成功获取AppKey 备注填写应用包名规范点,在项目还要用那 2.创建ionic 项目 指定你注册时候的包名(假如:com.ioni ...
- SQL 约束和表修改语句
1.约束作用: 约束的目的就是确保表中的数据的完整性 2.常用的约束类型如下 主键约束:(Primary Key constraint) 要求主键列唯一,并且不允许为空 唯一约束:(Unique ...
- ES6学习笔记之数组的扩展
✏️1. 扩展运算符 扩展运算符(spread)是三个点(...),将一个数组转为用逗号分隔的参数序列. 普通用法 console.log(...[1,2,3]);//1 2 3 数组拷贝(普通类型深 ...