判断最小生成树是否为一(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判断最小生成树的唯一性
题意: 判断最小树是否唯一. 思路: 我用了两种方法,主要就是好久没敲了,找个水题练练手,第一种就是先一遍最小生成树,然后枚举最小生成树上的每一条边,然后取消这条边,在跑一遍最小生 ...
随机推荐
- 从解决一个java.lang.NoSuchMethodError想到的
今天在发布系统部署一个web app的时候,发现应用服务器(tomcat 7.0.26)不能正常启动,于是远程登陆到服务器上查看应用服务器的启动日志,在tomcat_home的logs/localho ...
- java 数字转中文
java代码 数字转中文,该方法只做了对int型整数的转换 private static String numberToChinese(int number) { String[] numbers = ...
- MDN & IRC
MDN IRC MDN IRC xgqfrms https://developer.mozilla.org/en-US/docs/Mozilla/QA/Getting_Started_with_IRC ...
- Java面试题大汇总
前言 关于赢在面试的Java题系列基本收集整理完成了,所有题目都是经过精心挑选的,很基础又考验求职者的基本功,应该说被面试到的几率很大.这里整理挑选出来供大家面试前拿来看一看,所有题目整理自网络,有一 ...
- Python动态规划求解最长递增子序列(LIS)
原始代码错误,移步博客查看O(N^2)及优化的O(N*logN)的实现:每天一道编程题--最长递增子序列
- bzoj 1036: [ZJOI2008]树的统计Count (树链剖分+线段树 点权)
1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 21194 Solved: 8589[Submit ...
- c++11 可变参数模板函数
c++11 可变参数模板函数 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #in ...
- JeeSite 4.x SAAS 多租户技术设计方案
SaaS 是 Software-as-a-Service(软件即服务)的简称,从技术角度上可称之为 “多租户技术或称多重租赁技术”.它与 “按需软件.应用服务提供商.托管软件” 所具有相似的含义.它是 ...
- android:onClick="xxx"
一般监听OnClickListener事件,我们都是通过Button button = (Button)findViewById(....); button.setOClickLisener....这 ...
- PHP获取图片主题颜色
(1)工具类:pictureColor.php class pictureColor{ /** * 获取颜色使用库类型 */ public $type = 'gd'; ...