POJ 1679 判断最小树是否唯一
题意:
给你一个图,问你最小树是否唯一,唯一则输出最小数的权值,不唯一输出Not Unique!
思路:
题目问的是最小树是否唯一,其实也就是在问次小树是否等于最小树,如果等于则不唯一,求次小树快的方法应该是先求最小树,然后枚举删除最小树上的边,最快的应该是树形dp优化的那个吧,刚刚忘记了,直接求出最小树,然后暴力深搜分成两个集合枚举,0ms AC,因为点才100,所以暴力也无压力。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N_node 100 + 10
#define N_edge 20000 + 100
#define INF 1000000000
using namespace std;
typedef struct
{
int to ,next ,cost;
}STAR;
typedef struct
{
int a ,b ,c;
}EDGE;
STAR E[N_edge];
EDGE edge[N_edge] ,Tree[N_node];
int list[N_node] ,tot;
int mer[N_node];
int mark[N_node];
int map[N_node][N_node];
int node_l[N_node] ,node_r[N_node];
int ll ,rr;
void add(int a ,int b)
{
E[++tot].to = b;
E[tot].next = list[a];
list[a] = tot;
E[++tot].to = a;
E[tot].next = list[b];
list[b] = tot;
}
bool camp(EDGE a ,EDGE b)
{
return a.c < b.c;
}
int finds(int x)
{
return x == mer[x] ? x : mer[x] = finds(mer[x]);
}
void DFS1(int s)
{
node_l[++ll] = s;
for(int k = list[s] ;k ;k = E[k].next)
{
int to = E[k].to;
if(mark[to]) continue;
mark[to] = 1;
DFS1(to);
}
}
void DFS2(int s)
{
node_r[++rr] = s;
for(int k = list[s] ;k ;k = E[k].next)
{
int to = E[k].to;
if(mark[to]) continue;
mark[to] = 1;
DFS2(to);
}
}
int minn(int x ,int y)
{
return x < y ? x : y;
}
int main ()
{
int t ,n ,m ,i ,j;
scanf("%d" ,&t);
while(t--)
{
scanf("%d %d" ,&n ,&m);
for(i = 1 ;i <= n ;i ++)
for(j = 1 ;j <= n ;j ++)
map[i][j] = INF;
for(i = 1 ;i <= m ;i ++)
{
scanf("%d %d %d" ,&edge[i].a ,&edge[i].b ,&edge[i].c);
map[edge[i].a][edge[i].b] = map[edge[i].b][edge[i].a] = edge[i].c;
}
sort(edge + 1 ,edge + m + 1 ,camp);
int sum = 0;
for(i = 1 ;i <= n ;i ++) mer[i] = i;
memset(list ,0 ,sizeof(list)) ,tot = 1;
int tt = 0;
for(i = 1 ;i <= m ;i ++)
{
int x = finds(edge[i].a);
int y = finds(edge[i].b);
if(x == y) continue;
mer[x] = y;
sum += edge[i].c;
add(edge[i].a ,edge[i].b);
Tree[++tt].a = edge[i].a;
Tree[tt].b = edge[i].b;
Tree[tt].c= edge[i].c;
}
int now = 1000000000;
for(i = 1 ;i <= tt ;i ++)
{
int a = Tree[i].a;
int b = Tree[i].b;
int c = Tree[i].c;
memset(mark ,0 ,sizeof(mark));
mark[a] = mark[b] = 1;
ll = 0;
DFS1(a);
rr = 0;
DFS2(b);
for(int ii = 1 ;ii <= ll ;ii ++)
for(int jj = 1 ;jj <= rr ;jj ++)
{
int aa = node_l[ii];
int bb = node_r[jj];
if(map[aa][bb] == INF || aa == a && bb == b || aa == b && bb == a) continue;
now = minn(now ,sum - c + map[aa][bb]);
}
}
if(now != sum) printf("%d\n" ,sum);
else printf("Not Unique!\n");
}
return 0;
}
POJ 1679 判断最小树是否唯一的更多相关文章
- poj 1679 判断MST是不是唯一的 (次小生成树)
判断MST是不是唯一的 如果是唯一的 就输出最小的权值和 如果不是唯一的 就输出Not Unique! 次小生成树就是第二小生成树 如果次小生成树的权值和MST相等 那么MST就不是唯一的 法一: ...
- poj 1679 判断最小生成树是否唯一
/* 只需判断等效边和必选边的个数和n-1的关系即可 */ #include<stdio.h> #include<stdlib.h> #define N 110 struct ...
- POJ 1679 The Unique MST(判断最小生成树是否唯一)
题目链接: http://poj.org/problem?id=1679 Description Given a connected undirected graph, tell if its min ...
- POJ 1679 The Unique MST 【判断最小生成树是否唯一】
Description Given a connected undirected graph, tell if its minimum spanning tree is unique. Defini ...
- poj 1679 Prim判断次短路
题意:判断最短路是否唯一. 思路:先prrim一次求出最短路同时记录最短路加入的边: 然后枚举所求边,将其删除再求n-1次prim,判断再次所求得的最短路与第一次求得的次短路的关系. 代码: #inc ...
- poj 1679 The Unique MST 【次小生成树】【模板】
题目:poj 1679 The Unique MST 题意:给你一颗树,让你求最小生成树和次小生成树值是否相等. 分析:这个题目关键在于求解次小生成树. 方法是,依次枚举不在最小生成树上的边,然后加入 ...
- ZOJ - 2587 Unique Attack (判断最小割是否唯一)
题意:判断最小割是否唯一. 分析:跑出最大流后,在残余网上从源点和汇点分别dfs一次,对访问的点都打上标记. 若还有点没有被访问到,说明最小割不唯一. https://www.cnblogs.com/ ...
- 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 判断最小生成树是否唯一(图论)
借用的是Kruskal的并查集,算法中的一点添加和改动. 通过判定其中有多少条可选的边,然后跟最小生成树所需边做比较,可选的边多于所选边,那么肯定方案不唯一. 如果不知道这个最小生成树的算法,还是先去 ...
随机推荐
- Typora For Markdown 语法
数学表达式 要启用这个功能,首先到Preference->Editor中启用.然后使用$符号包裹Tex命令,例如:$lim_{x \to \infty} \ exp(-x)=0$将产生如下的数学 ...
- 自动化测试工具(基于WordCount作业)
本自动化测试的程序用于自动化测试WordCount作业,采用Java开发(基于jdk1.8+),基于Maven来管理项目. 支持的语言和开发进度 语言 进度 Java 已测试并投入运行 C++ 开发完 ...
- 文件锁fcntl
一.python中的文件锁 我们在写python应用的时候,当涉及到多个进程向同一个文件write(或者read)的情况,如果几个进程同时都对这个文件进行写操作,那么文件的内容就会变得非常混乱,这个时 ...
- IPFS挖矿硬盘满了会怎样?
IPFS是一个互联网协议,对标现在的HTTP.所以,可以想见未来IPFS有多大的价值.所谓IPFS挖矿,是基于IPFS,挖的是filecoin,称其为filecoin挖矿倒是更为贴切.许多初接触IPF ...
- c++ 反汇编 表达式
有符号数溢出: void BreakFor() { for (int i = 1; i > 0; i++) { printf("%d \r\n", i); } } 上面的程序 ...
- MySQL的安装及使用
安装MySQL 这里建议大家使用压缩版,安装快,方便.不复杂. 1.MySQL软件下载 mysql5.7 64位下载地址: https://dev.mysql.com/get/Downloads/My ...
- Git基本操作流程
技术背景 Gitee是一款国内的git托管服务,对于国内用户较为友好,用户可以访问Gitee地址来创建自己的帐号和项目,并托管在Gitee平台上.既然是git的托管服务,那我们就可以先看看git的一些 ...
- time模块&datetime模块
import time a=time.localtime(time.time()) #将时间戳转换为当前时区的元组 print(a) c=time.gmtime(time.time()) #把时间戳转 ...
- SpingCloud Alibaba实战(1:微服务与SpringCloud Alibaba)
1.什么是微服务? 微服务可谓是这几年比较热门的技术,从2017开始逐渐爆火,逐渐大大小小的公司纷纷将微服务技术引入并在实际业务中落地. 微服务的概念最早是在2014年由Martin Fowler和J ...
- Elasticsearch 主节点和暖热节点解析
Elasticsearch 主节点和暖热节点解析 主节点 控制整个集群,进行一些轻量级操作,列如:跟踪哪些节点是集群中的一部分,决定节点分片分配,负责集群健康, 不包含数据,也不参与搜索和索引操作,对 ...