题意:有T组数据,N个点,M条边,每条边有一定的花费。问最小生成树和次小生成树的权值。

解法:具体请见 关于生成树的拓展 {附【转】最小瓶颈路与次小生成树}(图论--生成树)

 1 #include<cstdio>
2 #include<cstdlib>
3 #include<cstring>
4 #include<algorithm>
5 #include<iostream>
6 using namespace std;
7
8 const int N=105,M=5005,C=305;
9 int n,m,mm;
10 struct edge
11 {
12 int x,y,d,next;
13 edge() {}
14 edge(int i,int j,int k) {x=i;y=j;d=k;}
15 }e[M],ee[M];
16 int fa[N],last[N],vis[N];
17 int ve[M],f[N][N];
18
19 bool cmp(edge x,edge y) {return x.d<y.d;}
20 int mmax(int x,int y) {return x>y?x:y;}
21 int mmin(int x,int y) {return x<y?x:y;}
22
23 int ffind(int x)
24 {
25 if (fa[x]!=x) fa[x]=ffind(fa[x]);
26 return fa[x];
27 }
28 int MST()
29 {
30 int cnt=0,sum=0;
31 for (int i=1;i<=n;i++) fa[i]=i;
32 memset(ve,0,sizeof(ve));
33 sort(e+1,e+1+m,cmp);
34 for (int i=1;i<=m;i++)
35 {
36 int fx=ffind(e[i].x),fy=ffind(e[i].y);
37 if (fx!=fy)
38 {
39 fa[fx]=fy,ve[i]=1;
40 ee[++cnt]=e[i],sum+=e[i].d;
41 if (cnt==n-1) break;
42 }
43 }
44 mm=cnt;
45 return sum;
46 }
47 void build()
48 {
49 memset(last,0,sizeof(last));
50 for (int i=1;i<n;i++)
51 {
52 int x=ee[i].x,y=ee[i].y;
53 ee[i].next=last[x],last[x]=i;
54 ee[++mm]=edge(y,x,ee[i].d);
55 ee[mm].next=last[y],last[y]=mm;
56 }
57 }
58 void dfs(int x)
59 {
60 vis[x]=1;
61 for (int i=last[x];i;i=ee[i].next)
62 {
63 int y=ee[i].y;
64 if (vis[y]) continue;
65 for (int k=1;k<=n;k++)
66 if (vis[k]) f[k][y]=f[y][k]=mmax(f[k][x],ee[i].d);//要赋值2个f[][]
67 dfs(y);
68 }
69 }
70 int main()
71 {
72 int T;
73 scanf("%d",&T);
74 while (T--)
75 {
76 int x,y,d;
77 scanf("%d%d",&n,&m);
78 for (int i=1;i<=m;i++)
79 {
80 scanf("%d%d%d",&x,&y,&d);
81 e[i]=edge(x,y,d);
82 }
83 int mn=MST(),mmn=C*M;
84 build();//把最小生成树的边重新建树
85 memset(f,0,sizeof(f));
86 memset(vis,0,sizeof(vis));
87 dfs(1);//预处理f[x][y]:两点间路径的最大边权
88 for (int i=1;i<=m;i++)
89 {
90 if (ve[i]) continue;
91 mmn=mmin(mmn,mn-f[e[i].x][e[i].y]+e[i].d);//直接算出删除MST上的一条边时的MST,即次小生成树
92 }
93 printf("%d %d\n",mn,mmn);
94 }
95 return 0;
96 }

【uva 10600】ACM Contest and Blackout(图论--次小生成树 模版题)的更多相关文章

  1. [ An Ac a Day ^_^ ] [kuangbin带你飞]专题八 生成树 UVA 10600 ACM Contest and Blackout 最小生成树+次小生成树

    题意就是求最小生成树和次小生成树 #include<cstdio> #include<iostream> #include<algorithm> #include& ...

  2. UVA10600:ACM Contest and Blackout(次小生成树)

    ACM Contest and Blackout 题目链接:https://vjudge.net/problem/UVA-10600 Description: In order to prepare ...

  3. UVA 10600 ACM Contest and Blackout 次小生成树

    又是求次小生成树,就是求出最小生成树,然后枚举不在最小生成树上的每条边,求出包含着条边的最小生成树,然后取一个最小的 #include <iostream> #include <al ...

  4. uva 10600 ACM Contest And Blackout

    题意: 求最小生成树和次小生成树的总权值. 思路: 第一种做法,适用于规模较小的时候,prim算法进行的时候维护在树中两点之间路径中边的最大值,复杂度O(n^2),枚举边O(m),总复杂度O(n^2) ...

  5. UVA-10600 ACM Contest and Blackout (次小生成树)

    题目大意:给一张无向图,找出最小生成树和次小生成树. 题目分析:模板题...方法就是枚举所有的比最小生成树中两端点之间的最长边还要长的边,用它替换,再取一个最小的值便是次小生成树了. 代码如下: # ...

  6. UVA-10600.Contest and Blackout.(Kruskal + 次小生成树)

    题目链接 本题思路:模版的次小生成树问题,输出MST and Second_MST的值. 参考代码: #include <cstdio> #include <cstring> ...

  7. UVA10600 ACM Contest and Blackout —— 次小生成树

    题目链接:https://vjudge.net/problem/UVA-10600 In order to prepare the “The First National ACM School Con ...

  8. 【uva 534】Frogger(图论--最小瓶颈路 模版题)

    题意:平面上有N个石头,给出坐标.一只青蛙从1号石头跳到2号石头,使路径上的最长便最短.输出这个值.(2≤N≤200) 解法:最小瓶颈树.而由于这题N比较小便可以用2种方法:1.最短路径中提到过的Fl ...

  9. 【UVA 10600】 ACM Contest and Blackout(最小生成树和次小生成树)

    [题意] n个点,m条边,求最小生成树的值和次小生成树的值. InputThe Input starts with the number of test cases, T (1 < T < ...

随机推荐

  1. LinkedList 的 API 与数据结构

    LinkedList 是 List 接口和 Deque 接口的双向链表实现,它所有的 API 调用都是基于对双向链表的操作.本文将介绍 LinkedList 的数据结构和分析 API 中的算法. 数据 ...

  2. Spring Boot Security 国际化 多语言 i18n 趟过巨坑

    网上很多的spring boot国际化的文章都是正常情况下的使用方法 如果你像我一样用了Spring Security 那么在多语言的时候可能就会遇到一个深渊 Spring Security里面的异常 ...

  3. Flutter 基础组件:进度指示器

    前言 Material 组件库中提供了两种进度指示器:LinearProgressIndicator和CircularProgressIndicator,它们都可以同时用于精确的进度指示和模糊的进度指 ...

  4. 剑指offer-56数组中数字出现的次数

    题目 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). 输入:nums = [4,1,4,6] 输出 ...

  5. Kubernetes学习笔记之认识Kubernetes组件

    前言:笔记知识点来源于Kubernetes官方文档说明,链接:https://kubernetes.io/docs/concepts/overview/components/ ,本记录仅仅是学习笔记记 ...

  6. Python使用Protobuf&&如何赋值&&如何正反序列化

    前言 使用protobuf主要是两个步骤,序列化和反序列化. 关于Proto有哪些数据类型,然后如何编写,此处就不赘述了,百度一下有很多. 此文主要是总结,python使用protobuf的过程,如何 ...

  7. 关于SSRF与CSRF漏洞的解释

    目录 SSRF服务端请求伪造(外网访问内网) 1.SSRF形成原因 2.利用SSRF漏洞的目的 3.SSRF漏洞的用途 4.SSRF漏洞的特性 实例 5.如何挖掘SSRF漏洞 6.常用SSRF去做什么 ...

  8. 安装newman error:package exports for 'c:\nmp\node_modules\newman\node_module 解决办法

    一.场景描述: 通过npm安装newman时,一直失败. 尝试了很多安装命令: npm install -g newman npm install -g newman --registry=http: ...

  9. mysql—if函数

    在mysql中if()函数的具体语法如下:IF(expr1,expr2,expr3),如果expr1的值为true,则返回expr2的值,如果expr1的值为false,则返回expr3的值. 开始实 ...

  10. Pulsar vs Kafka,CTO 如何抉择?

    本文作者为 jesse-anderson.内容由 StreamNative 翻译并整理. 以三个实际使用场景为例,从 CTO 的视角出发,在技术等方面对比 Kafka 和 Pulsar. 阅读本文需要 ...