您的位置:首页 > 其它

洛谷 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 3

1 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: