题意:

      给你一个图,问你最小树是否唯一,唯一则输出最小数的权值,不唯一输出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 判断最小树是否唯一的更多相关文章

  1. poj 1679 判断MST是不是唯一的 (次小生成树)

    判断MST是不是唯一的 如果是唯一的 就输出最小的权值和 如果不是唯一的 就输出Not Unique! 次小生成树就是第二小生成树  如果次小生成树的权值和MST相等  那么MST就不是唯一的 法一: ...

  2. poj 1679 判断最小生成树是否唯一

    /* 只需判断等效边和必选边的个数和n-1的关系即可 */ #include<stdio.h> #include<stdlib.h> #define N 110 struct ...

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

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

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

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

  5. poj 1679 Prim判断次短路

    题意:判断最短路是否唯一. 思路:先prrim一次求出最短路同时记录最短路加入的边: 然后枚举所求边,将其删除再求n-1次prim,判断再次所求得的最短路与第一次求得的次短路的关系. 代码: #inc ...

  6. poj 1679 The Unique MST 【次小生成树】【模板】

    题目:poj 1679 The Unique MST 题意:给你一颗树,让你求最小生成树和次小生成树值是否相等. 分析:这个题目关键在于求解次小生成树. 方法是,依次枚举不在最小生成树上的边,然后加入 ...

  7. ZOJ - 2587 Unique Attack (判断最小割是否唯一)

    题意:判断最小割是否唯一. 分析:跑出最大流后,在残余网上从源点和汇点分别dfs一次,对访问的点都打上标记. 若还有点没有被访问到,说明最小割不唯一. https://www.cnblogs.com/ ...

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

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

  9. poj 1679 The Unique MST 判断最小生成树是否唯一(图论)

    借用的是Kruskal的并查集,算法中的一点添加和改动. 通过判定其中有多少条可选的边,然后跟最小生成树所需边做比较,可选的边多于所选边,那么肯定方案不唯一. 如果不知道这个最小生成树的算法,还是先去 ...

随机推荐

  1. Typora For Markdown 语法

    数学表达式 要启用这个功能,首先到Preference->Editor中启用.然后使用$符号包裹Tex命令,例如:$lim_{x \to \infty} \ exp(-x)=0$将产生如下的数学 ...

  2. 自动化测试工具(基于WordCount作业)

    本自动化测试的程序用于自动化测试WordCount作业,采用Java开发(基于jdk1.8+),基于Maven来管理项目. 支持的语言和开发进度 语言 进度 Java 已测试并投入运行 C++ 开发完 ...

  3. 文件锁fcntl

    一.python中的文件锁 我们在写python应用的时候,当涉及到多个进程向同一个文件write(或者read)的情况,如果几个进程同时都对这个文件进行写操作,那么文件的内容就会变得非常混乱,这个时 ...

  4. IPFS挖矿硬盘满了会怎样?

    IPFS是一个互联网协议,对标现在的HTTP.所以,可以想见未来IPFS有多大的价值.所谓IPFS挖矿,是基于IPFS,挖的是filecoin,称其为filecoin挖矿倒是更为贴切.许多初接触IPF ...

  5. c++ 反汇编 表达式

    有符号数溢出: void BreakFor() { for (int i = 1; i > 0; i++) { printf("%d \r\n", i); } } 上面的程序 ...

  6. MySQL的安装及使用

    安装MySQL 这里建议大家使用压缩版,安装快,方便.不复杂. 1.MySQL软件下载 mysql5.7 64位下载地址: https://dev.mysql.com/get/Downloads/My ...

  7. Git基本操作流程

    技术背景 Gitee是一款国内的git托管服务,对于国内用户较为友好,用户可以访问Gitee地址来创建自己的帐号和项目,并托管在Gitee平台上.既然是git的托管服务,那我们就可以先看看git的一些 ...

  8. time模块&datetime模块

    import time a=time.localtime(time.time()) #将时间戳转换为当前时区的元组 print(a) c=time.gmtime(time.time()) #把时间戳转 ...

  9. SpingCloud Alibaba实战(1:微服务与SpringCloud Alibaba)

    1.什么是微服务? 微服务可谓是这几年比较热门的技术,从2017开始逐渐爆火,逐渐大大小小的公司纷纷将微服务技术引入并在实际业务中落地. 微服务的概念最早是在2014年由Martin Fowler和J ...

  10. Elasticsearch 主节点和暖热节点解析

    Elasticsearch 主节点和暖热节点解析 主节点 控制整个集群,进行一些轻量级操作,列如:跟踪哪些节点是集群中的一部分,决定节点分片分配,负责集群健康, 不包含数据,也不参与搜索和索引操作,对 ...