洛谷 2700 逐个击破
2017-10-11 17:09
260 查看
题目背景
三大战役的平津战场上,傅作义集团在以北平、天津为中心,东起唐山西至张家口的铁路线上摆起子一字长蛇阵,并企图在溃败时从海上南逃或向西逃窜。为了就地歼敌不让其逃走,毛泽东制定了先切断敌人东西两头退路然后再逐个歼灭敌人的战略方针。秉承伟大军事家的战略思想,作为一个有智慧的军长你,遇到了一个类似的战场局面。题目描述
现在有N个城市,其中K个被敌方军团占领了,N个城市间有N-1条公路相连,破坏其中某条公路的代价是已知的,现在,告诉你K个敌方军团所在的城市,以及所有公路破坏的代价,请你算出花费最少的代价将这K个地方军团互相隔离开,以便第二步逐个击破敌人。输入输出格式
输入格式:
第一行包含两个正整数n和k。第二行包含k个整数,表示哪个城市别敌军占领。
接下来n-1行,每行包含三个正整数a,b,c,表示从a城市到b城市有一条公路,以及破坏的代价c。城市的编号从0开始。
输出格式:
输出一行一个整数,表示最少花费的代价。输入输出样例
输入样例#1:
5 31 2 4
1 0 4
1 3 8
2 1 1
2 4 3
输出样例#1:
4说明
【数据范围】
10%的数据:2≤n≤10;100%的数据:2≤n≤100000,2≤k≤n,1≤c≤1000000。
/************************** Name:2700 逐个击破 How to get:luogu.org By:Shine_Sky **************************/ /******************************* 反最小生成树(感觉就是最大生成树) 我们将边从大到小排序 判断两点是否联通或者是否同时被占领 如果这么就跳过这边 *******************************/ #include<iostream> #include<algorithm> #include<cstdio> #define f(i,a,b) for(register int i=a;i<=b;i++) #define fd(i,a,b) for(register int i=a;i>=b;i--) using namespace std; inline int read() { int data=0,w=1; char ch=0; while(ch!='-' && (ch<'0' || ch>'9')) ch=getchar(); if(ch=='-') w=-1,ch=getchar(); while(ch>='0' && ch<='9') data=data*10+ch-'0',ch=getchar(); return data*w; } inline void write(long long x) { if(x<0) putchar('-'),x=-x; if(x>9) write(x/10); putchar(x%10+'0'); } const int N=1e5+7; int n=read(),k=read(),tream ; long long ans; bool book ; struct Road { int u,v,w; }a[N*2]; inline bool cmp(Road a,Road b) { return a.w>b.w; } inline int gf(int x) { if(tream[x]==x) return x; else return tream[x]=gf(tream[x]); } int main() { f(i,1,k) { int a=read(); book[a]=1; } f(i,1,n-1) a[i].u=read(),a[i].v=read(),a[i].w=read(),ans+=a[i].w; f(i,0,n) tream[i]=i; sort(a+1,a+n,cmp); f(i,1,n) { int u=gf(a[i].u),v=gf(a[i].v); if(u==v) continue; if(book[u] && book[v]) continue; tream[v]=u; book[u]= book[u] || book[v]; //如果连接到了被占领了的,另外一个点要被"假占领"(因为合并了,所只要改父亲占领状态就好了) //不然的话要是另外一个占领的点连接到了这个点那么就有两个被真占领点联通了 ans-=a[i].w; } write(ans); return 0; }
相关文章推荐
- luogu 2700 逐个击破
- 洛谷P2700 逐个击破
- 【luogu2700】逐个击破
- LuoguP2700逐个击破【并查集/生成树/正难则反】By cellur925
- IT项目十大灾难逐个击破
- luogu P2700 逐个击破
- CSharp难点逐个击破文档分享
- newssoj1004逐个击破attack(排序+并查集)
- JZOJ2936. 【NOIP2012模拟8.9】逐个击破(2017.9B组)
- 剑指offer_面试题6_重建二叉树(分解步骤,逐个击破)
- 2017.9.2总结1-逐个击破
- C#难点逐个击破(6):C#数据类型与.net framework数据类型
- [来源未知][树形dp]逐个击破
- tyvj3737 逐个击破
- 【NOIP2012模拟8.9】逐个击破
- JMeter 测试之逐个击破 视频教程(价值199.5元)
- C#难点逐个击破(9):类型转换
- C#难点逐个击破(1):ref参数传递
- C#难点逐个击破2out返回参数