图论——生成树

Tyvj 3737 逐个击破

描述

三大战役的平津战场上,傅作义集团在以北平、天津为中心,东起唐山西至张家口的铁路线上摆起子一字长蛇阵,并企图在溃败时从海上南逃或向西逃窜。为了就地歼敌不让其逃走,mzd制定了先切断敌人东洒两头退路然后再逐个歼灭敌人的战略方针。

秉承伟大军事家的战略思想,作为一个有智慧的军长你,遇到了一个类似的战场局面:

现在有N个城市,其中K个被敌方军团占领了,N个城市间有N-1条公路相连,破坏其中某条公路的代价是已知的,现在,告诉你K个敌方军团所在的城市,以及所有公路破坏的代价,请你算出花费最少的代价将这K个地方军团互相隔离开,以便第二步逐个击破敌人。

输入格式

第一行包含两个正整数n和k。

第二行包含k个整数,表示哪个城市别敌军占领。

接下来n-1行,每行包含三个正整数a,b,c,表示从a城市到b城市有一条公路,以及破坏的代价c。

城市的编号从0开始计数。

其中:

2<=n<=100000

2<=k<=n

1<=c<=1000000

输出格式

包含一个整数,表示最少花费的代价。

测试样例1

输入

3 3 
0 1 2 
0 1 1 
1 2 2

输出

3

测试样例2

输入

5 3 
1 2 4 
1 0 4 
1 3 8 
2 1 1 
2 4 3

输出

4

思路:

破坏的最少=留下的最多,最大生成树,使最多一个敌军驻地包含在内

代码:

 1 #include<iostream>
 2 #include<algorithm>
 3 #define mx 100005
 4 using namespace std;
 5 struct edge{
 6        int u;
 7        int v;
 8        long long w;
 9 };
10 int n,k,j[mx],vis[mx],pre[mx],fa,fb;
11 edge g[mx],tmp;
12 int findf(int x){
13      int t = x,k,r,sign = 0;
14      while(x != pre[x]) x = pre[x];
15      r = x;
16      if(j[r]) sign = 1;
17      while(t != r){
18               j[t] = sign;
19              k = pre[t];
20              pre[t] = r;
21              t = k;
22      }
23      return r;
24 }
25 bool cmp(edge a,edge b){
26      return a.w > b.w;
27 }
28 int main(){
29     cin>>n>>k;
30     long long u,v,w,ans = 0,sum = 0;
31     for(int i = 1;i <= k;i++){
32             cin>>u;
33             j[u] = 1;
34     }
35     for(int i = 1;i < n;i++){
36             cin>>u>>v>>w;
37             sum += w;
38             tmp.u = u;
39             tmp.v = v;
40             tmp.w = w;
41             g[i] = tmp;
42     }
43     for(int i = 0;i <= n;i++){
44             pre[i] = i;
45     }
46     sort(g+1,g+n-1,cmp);
47
48
49     for(int i = 1;i < n;i++){
50         fa = findf(g[i].u);
51         fb = findf(g[i].v);
52         if(j[fa] && j[fb]) continue;
53         j[fb] = (j[fa] || j[fb]);
54         pre[fa] = pre[fb];
55         ans += g[i].w;
56
57     }
58     cout<<sum - ans<<endl;
59     return 0;
60 }

时间: 2024-10-14 01:27:33

图论——生成树的相关文章

图论 - 数论 - 生成树

图论 - 数论 - 生成树 题目链接:https://www.luogu.org/problem/P3366 代码: #include <bits/stdc++.h> using namespace std; const int N = 5010; const int M = 200010; int n, m, dis[N], ans; int tot, head[N], val[M << 1], nxt[M << 1] ,to[M << 1]; bool

图论(生成树):HDU 5631Rikka with Graph

Rikka with Graph Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 118    Accepted Submission(s): 52 Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, s

图论及其应用——树

在之前初步介绍图的文章中,我们得知,图(graph)是表征事物之间关系的一种抽象化表示方法,而基于图的概念,我们将所有的无回路无向图拿出来,给它们一个新的名字——树.  关于树的概念性术语很多,这里我们先就简单的二叉树(一个根至多有两个子树)来进行分析.    这就是一些简单的二叉树,这里A.B.C等我们成为节点.A叫做根节点,它的两个分支是B和C,并且我们称B是一个左子树,C是一个右子树,知道了这些简单的概念,我们就可以初步的探讨一些问题了. 二叉树树作为一种特殊的图,我们也要研究其遍历的方式

bestcoder #71 1003 找位运算&amp;的最大生成树

Clarke and MST Accepts: 33 Submissions: 92 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) 问题描述 克拉克是一名人格分裂患者.某一天克拉克变成了一名图论研究者. 他学习了最小生成树的几个算法,于是突发奇想,想做一个位运算and的最大生成树. 一棵生成树是由n-1n−1条边组成的,且nn个点两两可达.一棵生成树的大小等于所有在生成树上的边的权

[转] 一些图论、网络流入门题总结、汇总

最短路问题此类问题类型不多,变形较少 POJ 2449 Remmarguts' Date(中等)http://acm.pku.edu.cn/JudgeOnline/problem?id=2449题意:经典问题:K短路解法:dijkstra+A*(rec),方法很多相关:http://acm.pku.edu.cn/JudgeOnline/showcontest?contest_id=1144该题亦放在搜索推荐题中 POJ 3013 - Big Christmas Tree(基础)http://ac

图论算法 有图有代码 万字总结 向前辈致敬

图的定义 背景知识 看到这篇博客相信一开始映入读者眼帘的就是下面这幅图了,这就是传说中的七桥问题(哥尼斯堡桥问题).在哥尼斯堡,普雷格尔河环绕着奈佛夫岛(图中的A岛).这条河将陆地分成了下面4个区域,该处还有着7座连接这些陆地的桥梁. 问题是如何从某地出发,依次沿着各个桥,必须经过每座桥且每座桥只能经过1次,最终回到原地. 不知道这个问题且好奇的童鞋现在肯定在忙活着找出来这道题的结果了. 是伟大的数学家欧拉(Leonhard Euler)在1736年首次使用图的方法解决了该问题. 欧拉将上面的模

【转】一些图论、网络流入门题总结、汇总

最短路问题 此类问题类型不多,变形较少 POJ 2449 Remmarguts' Date(中等) http://acm.pku.edu.cn/JudgeOnline/problem?id=2449 题意:经典问题:K短路 解法:dijkstra+A*(rec),方法很多 相关:http://acm.pku.edu.cn/JudgeOnline/showcontest?contest_id=1144 该题亦放在搜索推荐题中 POJ 3013 - Big Christmas Tree(基础) ht

图论常用算法之二 算法模板及建模总结

寒假的第二周,弥补了一下图论算法.在这里做一下总结,主要针对近期学到的一些建模技巧,同时也非常感谢有朋友能够给出图论算法相关的精彩讲解或者知识链接. 算法总结: 欧拉回路问题:判断图是否存在欧拉回路或者欧拉通路,输出一条欧拉回路. 学习Fleury算法输出一条欧拉回路. 1 /* G是连通无向图,则称经过G的每条边一次并且仅一次的路径为 2 欧拉通路,起点和终点是同一个顶点称为欧拉回路,具有欧拉回路的 3 无向图为欧拉图. 4 依次有有向欧拉通路,有向欧拉回路,有向欧拉图 5 定理:连通图G仅有

【离散数学2】代数系统与图论个人总结

代数系统部分 基础定理 鸽巢原理 群论 广群 半群 独异点 群 群的阶数与元素的阶数 陪集与拉格朗日定理 特殊群 交换/阿贝尔群 循环群 sylow定理 环与域 环 整环 域 格论 格 分配格 模格 有界格 补格 图论部分 基础定理 握手定理 握手定理,有n个人握手,每人握手x次,握手总次数为S= nx/2. 推出 图的度与边数的关系 基础概念 路 节点与相邻的边交替出现 v0e1v1e2...vn-1envn 回路  v0=vn的路//某教材虽然这么写 但题出的都是欧拉回路呵呵 通路 圈 迹