判断最小生成树是否为一(krustra)
题目链接: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)的更多相关文章
- POJ 1679 The Unique MST(判断最小生成树是否唯一)
题目链接: http://poj.org/problem?id=1679 Description Given a connected undirected graph, tell if its min ...
- poj1679(判断最小生成树是否唯一)
题意:给出n个点,m条边,要你判断最小生成树是否唯一. 思路:先做一次最小生成树操作,标记选择了的边,然后枚举已经被标记了的边,判断剩下的边组成的最小生成树是否与前面的相等,相等,则不唯一,否则唯一. ...
- POJ 1679 The Unique MST (次小生成树 判断最小生成树是否唯一)
题目链接 Description Given a connected undirected graph, tell if its minimum spanning tree is unique. De ...
- POJ-1679 The Unique MST(次小生成树、判断最小生成树是否唯一)
http://poj.org/problem?id=1679 Description Given a connected undirected graph, tell if its minimum s ...
- Practice:输入年月日,判断该时间为一年的第几天
#-*- coding:utf- -*- ''' Created on -- # 输入年月日,判断为一年的第几天 @author: AdministrInputator ''' def leapYea ...
- POJ-1679 The Unique MST (判断最小生成树的唯一性)
<题目链接> 题目大意: 给定一张无向图,判断其最小生成树是否唯一. 解题分析: 对图中每条边,扫描其它边,如果存在相同权值的边,则标记该边:用kruskal求出MST. 如果MST中无标 ...
- POJ 1679 The Unique MST 【判断最小生成树是否唯一】
Description Given a connected undirected graph, tell if its minimum spanning tree is unique. Defini ...
- 最小生成树算法(krustra+prime)
给你一个图,求让图连通的边权和最小值 krustra算法是基于加边法,将所有边权排序,每次加一条边,将两个点放在同一个集合中.如果新加的点不在同一个集合中,就合并(并查集) 涉及到排序,可以用结构体存 ...
- POJ1679判断最小生成树的唯一性
题意: 判断最小树是否唯一. 思路: 我用了两种方法,主要就是好久没敲了,找个水题练练手,第一种就是先一遍最小生成树,然后枚举最小生成树上的每一条边,然后取消这条边,在跑一遍最小生 ...
随机推荐
- MDN & IRC
MDN IRC MDN IRC xgqfrms https://developer.mozilla.org/en-US/docs/Mozilla/QA/Getting_Started_with_IRC ...
- python自动化之读写
############################################################################# #############在Windows上 ...
- YARN的重启动问题:RM Restart/RM HA/Timeline Server/NM Restart
ResourceManger Restart ResourceManager负责资源管理和应用的调度,是YARN的核心组件,有可能存在单点失败的问题.ResourceManager Restart是使 ...
- List、Set、Map
List:1.可以允许重复的对象. 2.可以插入多个null元素. 3.是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序. 4.常用的实现类有 ArrayList.LinkedLi ...
- c语言宏定义#define
1. 利用define来定义 数值宏常量 #define 宏定义是个演技非常高超的替身演员,但也会经常耍大牌的,所以我们用它要慎之又慎.它可以出现在代码的任何地方,从本行宏定义开始,以后的代码就就都认 ...
- CF915E Physical Education Lessons
题意: Alex高中毕业了,他现在是大学新生.虽然他学习编程,但他还是要上体育课,这对他来说完全是一个意外.快要期末了,但是不幸的Alex的体育学分还是零蛋! Alex可不希望被开除,他想知道到期末还 ...
- vyatta的fork开源版本vyos
vyatta的fork开源版本vyos 来源: https://www.reddit.com/r/networking/comments/3dvwfy/who_here_is_using_vyos/ ...
- logstash5生成init脚本后台启动
默认情况使用rpm包安装完logstash之后没有启动脚本,这一点我觉得算是开发不够彻底.官网给了一个脚本,需要根据不同的系统版本生成对应的启动脚本,而且官网没有给明使用方法,对于新用户来说算是个坑, ...
- Python【datetime】模块
import datetimeprint("==============date类================")#创建一个date对象:datetime.date(year, ...
- shell比较浮点数和整数
今天有一个朋友忽然问我在shell中,如何比较浮点数和整数,倒是把我问的一愣,在工作中确实没有遇到这个场景.我们也知道,在shell中数字的计算通常都会转换成整数,比如说1.1和1会被认为是一样的.这 ...