题意:

      给你一个图,问你最小树是否唯一,唯一则输出最小数的权值,不唯一输出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;
}



最新文章

  1. Jquery 前端模版
  2. myeclipse2014破解过程
  3. 并查集 基础 AC 2014-01-14 13:37 202人阅读 评论(0) 收藏
  4. J2SE知识点摘记(二十)
  5. 开启新的activity获取它的返回值
  6. hdu1042
  7. Debian/Ubuntu安装Oracle客户端TNS
  8. 使用map做数组与链表去重
  9. JavaScript的setter与getter方法
  10. KiB 、十进制单位转换 、二进制单位转换
  11. Ubuntu16.04配置静态IP地址
  12. Fiddler 简介
  13. Java数据类型的转换
  14. sysbench相关
  15. Spring4.0系列9-websocket简单应用
  16. 解决emacs配置tern报错`tern-reparse-on-idle&#39;:
  17. Vmwaretools
  18. 一款基于uploadify扩展的多文件上传插件,完全适用于Html5
  19. List和String数组相互转化
  20. 使用JAXB读写xml

热门文章

  1. C++共享数据保护机制
  2. HDOJ-1686(KMP算法)
  3. NodeJs 入门到放弃 — 网络服务器(三)
  4. there is nothing(i春秋CTF题解)
  5. Shiro反序列化&lt;=1.2.4 复现
  6. 零投资!零风险!手把手教你挖pi币
  7. ElasticSearch 进阶
  8. ts装饰器的用法,基于express创建Controller等装饰器
  9. mongodb为什么比mysql效率高
  10. java 递归求二叉树深度