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的并查集,算法中的一点添加和改动. 通过判定其中有多少条可选的边,然后跟最小生成树所需边做比较,可选的边多于所选边,那么肯定方案不唯一. 如果不知道这个最小生成树的算法,还是先去 ...
 
随机推荐
- .NET CORE 3.1   MVC  Log4net
			
1 引用包:Microsoft.Extensions.Logging.Log4Net.AspNetCore 2 ILoggerFactory loggerFactory 注册 public voi ...
 - 10个顶级Python实用库,推荐你试试!
			
为什么我喜欢Python?对于初学者来说,这是一种简单易学的编程语言,另一个原因:大量开箱即用的第三方库,正是23万个由用户提供的软件包使得Python真正强大和流行. 在本文中,我挑选了15个最有用 ...
 - 创建一个scrapy爬虫框架的项目
			
第一步:打开pycharm,选择"terminal",如图所示: 第二步:在命令中端输入创建scrapy项目的命令:scrapy startproject demo (demo指的 ...
 - RFC2544吞吐量测试详细步骤-MiniSMB-HurricaneII软件操作演示
			
RFC2544吞吐量测试详细步骤-MiniSMB-HurricaneII软件操作演示 关键词:网络性能测试:RFC2544:吞吐量:吞吐率. RFC2544协议是RFC组织提出的用于评测网络互联设备( ...
 - CISCN-2018-Quals-note-service2
			
CISCN-2018-Quals-note-service2 总结 做完这道题,收获如下: 1)汇编语句jmp short s,最后编译出来的机器码为\xEB\x??,问号代表pc寄存器会往前或往后跳 ...
 - 什么是ETL?
			
一.ETL概念之背景 随着企业的发展,目前的业务线越来越复杂,各个业务系统独立运营.例如:CRM系统只会生产CRM的 数据:Billing只会生产Billing的数据.各业务系统之间只关心自己的数据, ...
 - java基础详解-集合
			
一.集合组成 java集合主要由Map和Collection组成,Collection主要类图如下(图片来源于网络,懒得画图): 从上图中能很明显的看出来Collection下主要是Set.List和 ...
 - Hibernate Validator异常HV000221解决办法
			
自建博客地址:https://www.bytelife.net,欢迎访问! 本文为博客同步发表文章,为了更好的阅读体验,建议您移步至我的博客 本文作者: Jeffrey 本文链接: https://w ...
 - WinForm的Socket实现简单的聊天室 IM
			
1:什么是Socket 所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象. 一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制. 从 ...
 - css实现一个电影卡片
			
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...