题目链接:https://vjudge.net/contest/66965#problem/K

具体思路:

首先跑一遍最短路算法,然后将使用到的边标记一下,同时使用一个数组记录每一个权值出现的次数,如果出现过的权值超过一次,那么每一次标记一条标记过的边,再去跑最短路算法,如果去除这条边之后的权值和未未去除的时候的权值相同,那么这个最短生成树就不是唯一的,否则就是唯一的。

AC代码:

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
#include<stdio.h>
using namespace std;
# define maxn 100000+10
# define inf 0x3f3f3f3f
# define ll long long
int n,m,tt;
int vis[maxn];
int father[maxn];
int first;
struct node
{
int num;
int fr;
int to;
int cost;
int chu;
} q[maxn];
bool cmp(node t1,node t2)
{
return t1.cost<t2.cost;
}
int Find(int t)
{
return t==father[t]? t: father[t]=Find(father[t]);
}
int krustra(int w)
{
for(int i=1; i<=n; i++)
{
father[i]=i;
}
int sum=0;
for(int i=1; i<=tt; i++)
{
if(q[i].num==w)continue;
int s1=Find(q[i].fr);
int s2=Find(q[i].to);
if(s1!=s2)
{
sum+=q[i].cost;
father[s1]=s2;
if(first==1){//第一次记录未去掉边的时候的所选的边。
q[i].chu=1;
}
}
}
return sum;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(vis,0,sizeof(vis));
scanf("%d%d",&n,&m);
tt=0;
int t1,t2,t3;
for(int i=1; i<=m; i++)
{
scanf("%d%d%d",&t1,&t2,&t3);
q[++tt].fr=t1;
q[tt].to=t2;
q[tt].cost=t3;
q[tt].num=i;
q[tt].chu=0;
q[++tt].fr=t2;
q[tt].to=t1;
q[tt].cost=t3;
q[tt].num=i;
vis[t3]++;
q[tt].chu=0;//
}
sort(q+1,q+tt+1,cmp);
first=1;
int ans=krustra(0);
first=0;
int flag=0;
for(int i=1; i<=tt; i++)
{
if(vis[q[i].cost]>=2&&q[i].chu==1)//如果这条边的权值出现过不止一次并且在最短路中出现过,那么这条边就成为了实验对象。
{
int temp=krustra(q[i].num);
if(temp==ans)
{
flag=1;
break;
}
}
}
if(flag==1)printf("Not Unique!\n");
else printf("%d\n",ans);
}
return 0;
}

判断最小生成树是否为一(krustra)的更多相关文章

  1. POJ 1679 The Unique MST(判断最小生成树是否唯一)

    题目链接: http://poj.org/problem?id=1679 Description Given a connected undirected graph, tell if its min ...

  2. poj1679(判断最小生成树是否唯一)

    题意:给出n个点,m条边,要你判断最小生成树是否唯一. 思路:先做一次最小生成树操作,标记选择了的边,然后枚举已经被标记了的边,判断剩下的边组成的最小生成树是否与前面的相等,相等,则不唯一,否则唯一. ...

  3. POJ 1679 The Unique MST (次小生成树 判断最小生成树是否唯一)

    题目链接 Description Given a connected undirected graph, tell if its minimum spanning tree is unique. De ...

  4. POJ-1679 The Unique MST(次小生成树、判断最小生成树是否唯一)

    http://poj.org/problem?id=1679 Description Given a connected undirected graph, tell if its minimum s ...

  5. Practice:输入年月日,判断该时间为一年的第几天

    #-*- coding:utf- -*- ''' Created on -- # 输入年月日,判断为一年的第几天 @author: AdministrInputator ''' def leapYea ...

  6. POJ-1679 The Unique MST (判断最小生成树的唯一性)

    <题目链接> 题目大意: 给定一张无向图,判断其最小生成树是否唯一. 解题分析: 对图中每条边,扫描其它边,如果存在相同权值的边,则标记该边:用kruskal求出MST. 如果MST中无标 ...

  7. POJ 1679 The Unique MST 【判断最小生成树是否唯一】

    Description Given a connected undirected graph, tell if its minimum spanning tree is unique.  Defini ...

  8. 最小生成树算法(krustra+prime)

    给你一个图,求让图连通的边权和最小值 krustra算法是基于加边法,将所有边权排序,每次加一条边,将两个点放在同一个集合中.如果新加的点不在同一个集合中,就合并(并查集) 涉及到排序,可以用结构体存 ...

  9. POJ1679判断最小生成树的唯一性

    题意:      判断最小树是否唯一. 思路:      我用了两种方法,主要就是好久没敲了,找个水题练练手,第一种就是先一遍最小生成树,然后枚举最小生成树上的每一条边,然后取消这条边,在跑一遍最小生 ...

随机推荐

  1. git工具的使用总结

    Git的使用 进入一个新的公司或者参入一个新的项目后,可能的第一步就是获取代码仓库的代码.公司内部一般放到代码仓库(下面主要以gitHub.Windows平台为例)的代码都经过加密认证的. 如何将Gi ...

  2. sqlserver查询数据库中包含某个字段的所有表和所有存储过程

    1.查询包含某字段的所有表 select object_name(id) objName,Name as colName from syscolumns where (name like'%你要查询的 ...

  3. [转]跨平台开发:PhoneGap移动开发框架初探

    目前,随着Google的Android手机和苹果的iphone手机的逐渐普及,越来越多开发者加入到移动应用开发的大军当中.其中,Android应用是基于Java语言基础上进行开发的,而苹果公司的iph ...

  4. 关于#pragma comment

    #pragma comment(lib,"ws2_32.lib") #pragma comment(lib,"ws2_32.lib")表示连接Ws2_32.li ...

  5. JAVA Junit4

                                   JAVA     Junit4   测试框架 序言 刚学Java的时候就听说过JUnit了,单元测试框架,很好用的测试框架,JUnit测试 ...

  6. UILabel居中显示的方法

    在IB中拖出一个UIView @IBOutlet weak var myView: UIView! 下面创建的UILabel是在myView中居中显示 方法1: var label = UILabel ...

  7. BZOJ 3295 动态逆序对 | CDQ分治

    BZOJ 3295 动态逆序对 这道题和三维偏序很类似.某个元素加入后产生的贡献 = time更小.pos更小.val更大的元素个数 + time更小.pos更大.val更小的元素个数. 分别用类似C ...

  8. 【uoj131】 NOI2015—品酒大会

    http://uoj.ac/problem/131 (题目链接) 题意 给出一个字符串,每个后缀有一个权值${a_i}$,这些后缀两两之间存在公共前缀.问能够组成长度从0~n-1的公共前缀的后缀的方案 ...

  9. 所以到底什么是 Growth Hacking?

    Growth hacking 在硅谷的确是有快被用坏的趋势,之所以在大陆的互联网创业圈里还没有普及开来,我想一个是由于这个词并没有对应的中文解释,没有一个能够找到一个相对完美的解释,就像 “hack” ...

  10. Reactor模式,或者叫反应器模式 - 为什么用多路io复用提供吞吐量

    Reactor这个词译成汉语还真没有什么合适的,很多地方叫反应器模式,但更多好像就直接叫reactor模式了,其实我觉着叫应答者模式更好理解一些.通过了解,这个模式更像一个侍卫,一直在等待你的召唤,或 ...