UVA 10462 Is There A Second Way Left? (次小生成树+kruskal)

题目大意:

  Nasa应邻居们的要求,决定用一个网络把大家链接在一起。给出v个点,e条可行路线,每条路线分别是x连接到y需要花费w。

  1:如果不存在最小生成树,输出“No way”.

  2:如果不存在次小生成树,输出“No second way”.

  3:如果两者都存在,输出次小生成树的长度.

解题思路:

  次小生成数+kruskal模板

  1 #include <cmath>
  2 #include <queue>
  3 #include <string>
  4 #include <cstdio>
  5 #include <cstring>
  6 #include <iostream>
  7 #include <algorithm>
  8 using namespace std;
  9
 10 const int maxn = 210;
 11 const int INF = 0x3f3f3f3f;
 12 const double Exp = 1e-10;
 13 struct node
 14 {
 15     int x, y, w;
 16
 17 };
 18 bool cmp (node a, node b)
 19 {
 20     return a.w < b.w;
 21 }
 22 node stu[maxn];
 23 int v, e, father[maxn], path[maxn];
 24
 25 void init ()
 26 {
 27     for (int i=0; i<=v; i++)
 28         father[i] = i;
 29 }
 30
 31 int find (int x)
 32 {
 33     if (father[x] != x)
 34         father[x] = find(father[x]);
 35     return father[x];
 36 }
 37 int kruskal ()
 38 {
 39     int i, j, num = 0;
 40     for (i=0,j=1; i<e; i++)
 41     {
 42         int px = find (stu[i].x);
 43         int py = find (stu[i].y);
 44         if (px != py)
 45         {
 46             num += stu[i].w;
 47             path[j++] = i;
 48             father[px] = py;
 49         }
 50     }
 51     int ans = 0;
 52     for (i=1; i<=v; i++)
 53         if (father[i] == i)
 54             ans ++;
 55     if (ans == 1)
 56         return num;
 57     return INF;
 58 }
 59 int smst (int x)
 60 {
 61     int i, num = 0;
 62     for (i=0; i<e; i++)
 63     {
 64         int px = find(stu[i].x);
 65         int py = find(stu[i].y);
 66         if (px != py && i != x)
 67         {
 68             num += stu[i].w;
 69             father[px] = py;
 70         }
 71     }
 72     int ans = 0;
 73     for (i=1; i<=v; i++)
 74         if (father[i] == i)
 75             ans ++;
 76     if (ans == 1)
 77         return num;
 78     return INF;
 79 }
 80 int main ()
 81 {
 82     int t, l = 1;
 83     scanf ("%d", &t);
 84     while (t --)
 85     {
 86         scanf ("%d %d", &v, &e);
 87         for (int i=0; i<e; i++)
 88             scanf ("%d %d %d", &stu[i].x, &stu[i].y, &stu[i].w);
 89         sort (stu, stu+e, cmp);
 90         int num1 , num2;
 91         num1 = num2 = INF;
 92         init ();
 93         num1 = kruskal();
 94         for (int i=1; i<v; i++)
 95         {
 96             init ();
 97             num2 = min (num2, smst(path[i]));
 98         }
 99         if (num1 == INF)
100             printf ("Case #%d : No way\n", l++);
101         else if (num2 == INF)
102             printf ("Case #%d : No second way\n", l++);
103         else
104             printf ("Case #%d : %d\n", l++, num2);
105     }
106     return 0;
107 }
时间: 2024-08-29 13:31:23

UVA 10462 Is There A Second Way Left? (次小生成树+kruskal)的相关文章

UVA - 10462 Is There A Second Way Left?(次小生成树)

题目大意:给出一张图,看能形成几个生成树 解题思路:先判断能否形成生成树,在判断是否有次小生成树 #include <cstdio> #include <cstring> #include <vector> using namespace std; #define N 110 #define M 410 #define INF 0x3f3f3f3f struct Edge{ int from, to, cost, next; }E[M]; int head[N], d[

UVA - 1494 Qin Shi Huang&#39;s National Road System (类次小生成树)

Description During the Warring States Period of ancient China(476 BC to 221 BC), there were seven kingdoms in China -- they were Qi, Chu, Yan, Han, Zhao, Wei and Qin. Ying Zheng was the king of the kingdom Qin. Through 9 years of wars, he finally con

UVA 10600 &amp; 次小生成树

这道题涉及次小生成树,有必要先弄明白次小生成树是怎么一回事. 次小生成树,顾名知义.一个定理是,次小生成树可以由最小生成树交换一条边得到.这怎么证明,可以上网搜一下.但有必要提醒的是,交换过来的这样一条边,必须是未成使用过的(即不是最小生成树的边).而且,交换走的边,必须是已存在的,而且是两点间最短路径的最大边权的边. 所以,可以在求最小生成树时求这最大边权的边. 1 void prim(){ 2 memset(f,0,sizeof(f)); 3 least[1]=0; 4 for(int i=

[kuangbin带你飞]专题八 生成树 - 次小生成树部分

百度了好多自学到了次小生成树 理解后其实也很简单 求最小生成树的办法目前遇到了两种 1 prim 记录下两点之间连线中的最长段 F[i][k] 之后枚举两点 若两点之间存在没有在最小生成树中的边 那么尝试加入它 然后为了不成环 要在环中去除一条边 为了达到"次小"的效果 减去最长的 即F[i][k] 求一下此时的数值 不断更新次小值 2 kru 记录下被加入到最小生成树中的线段 然后进行n-1次枚举 每次都跳过一条被记录的边 求一次kru 得到的值为-1或者一个可能成为次小的值 不断更

kuangbin带你飞 生成树专题 : 次小生成树; 最小树形图;生成树计数

第一个部分 前4题 次小生成树 算法:首先如果生成了最小生成树,那么这些树上的所有的边都进行标记.标记为树边. 接下来进行枚举,枚举任意一条不在MST上的边,如果加入这条边,那么肯定会在这棵树上形成一个环,如果还要维护处树的特点 那么就要在这个环上删去一条边,这样他还是树,删掉的边显然是这条链上权值最大边更可能形成次小生成树.那么就有2中方法可以做. 第一种PRIM在prim时候直接可以做出这个从I到J的链上权值最大的值MAX[i][j]; 同时可以用kruskal同样方式标记树边,然后DFS跑

ACM第一阶段学习内容

一.知识目录 字符串处理 ................................................................. 3 1.KMP 算法 ............................................................ 3 2.扩展 KMP ............................................................ 6 3.Manacher 最长回文子串 .......

[kuangbin带你飞]专题六 生成树

A. POJ 1679  The Unique MST 题意:最小生成树是不是唯一的. 思路:参考http://www.cnblogs.com/onlyAzha/p/4793031.html B. HDU 4081  Qin Shi Huang's National Road System 题意:秦始皇想要在城市之间修路.徐福可以用法力帮助他修一条路.秦始皇希望修一条路使得剩下的路需要的花费B最少,而徐福希望这条路所连的两个城市的人口数之和A最大.权衡后他们决定选择A/B的值最大的边来修建. 思

ACM训练方案-POJ题目分类

ACM训练方案-POJ题目分类 博客分类: 算法 ACM online Judge 中国: 浙江大学(ZJU):http://acm.zju.edu.cn/ 北京大学(PKU):http://acm.pku.edu.cn/JudgeOnline/ 杭州电子科技大学(HDU):http://acm.hdu.edu.cn/ 中国科技大学(USTC):http://acm.ustc.edu.cn/ 北京航天航空大学(BUAA)http://acm.buaa.edu.cn/oj/index.php 南京

剪辑的楼天城的ACM之路

楼天城楼教主的acm心路历程(剪辑) 利用假期空闲之时,将这几年GCJ,ACM,TopCoder 参加的一些重要比赛作个回顾.昨天是GCJ2006 的回忆,今天时间上更早一些吧,我现在还清晰记得3 年前,我刚刚参加ACM 时参加北京赛区2005 和杭州赛区2005 的情况.2005 年ACM-ICPC——酸甜苦辣我进入清华大学开始本科学习的时间是2004 年8 月,在进入清华大学的第一年里,由于基础课学习比较紧张,再加上计算机系不允许大一学生自带电脑,我没有参加2004 年的ACM 比赛.不过在