博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P2700逐个击破(并查集/树形dp)
阅读量:4314 次
发布时间:2019-06-06

本文共 2086 字,大约阅读时间需要 6 分钟。

 P2700 逐个击破

题目背景

三大战役的平津战场上,傅作义集团在以北平、天津为中心,东起唐山西至张家口的铁路线上摆起子一字长蛇阵,并企图在溃败时从海上南逃或向西逃窜。为了就地歼敌不让其逃走,老毛同志制定了先切断敌人东西两头退路然后再逐个歼灭敌人的战略方针。秉承伟大军事家的战略思想,作为一个有智慧的军长你,遇到了一个类似的战场局面。

题目描述

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

输入输出格式

输入格式:

 

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

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

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

 

输出格式:

 

输出一行一个整数,表示最少花费的代价。

 

输入输出样例

输入样例#1: 
5 31 2 41 0 41 3 82 1 12 4 3
输出样例#1: 
4

说明

【数据范围】

10%的数据:2≤n≤10;

100%的数据:2≤n≤100000,2≤k≤n,1≤c≤1000000。

 

/*逆向并查集把有敌人的联通块标记一下别忘开long long */#include
#define N 100001#define ll long longusing namespace std;int n,m,cnt;ll ans;int head[N<<1],a[N],fa[N],opt[N];struct edge{ int u,v,w,nxt; bool operator < (const edge a) const{ return w>a.w; } }e[N<<1];inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){
if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f;}int find (int x){ return x==fa[x]?fa[x]:fa[x]=find(fa[x]);}int main(){ //freopen("ly.in","r",stdin); int x,y,z; n=read();m=read(); for(int i=1;i<=m;i++) a[i]=read(),opt[a[i]]=1; for(int i=1;i

 

/*注意:此代码wa了一个点...... I don't know why...f[u][0]表示到了u这个点,子树已经合法,当前点所在集合没有敌人的最小代价f[u][1]表示到了u这个点,子树已经合法,当前点所在集合有敌人的最小代价u有无敌人分情况转移u号点没有敌人,那么f[u][1]就意味着要从子树中选一个能使花费最小的f[v][1],其他子树都切断或者从f[v][0]转移这时候f[u][0]+=min(f[v][0], f[v][1]+e[i].w)(v是儿子节点) u有敌人时初值f[u][0]=inff[u][1]+=min(f[v][0],f[v][1]+w[i]) 只能和有敌人的儿子节点断绝联系*/#include
#define N 100001#define ll long long#define inf 0x3f3f3f3fusing namespace std;ll n,m,cnt;ll ans,f[N][2];ll head[N<<1],opt[N],have[N];struct edge{ ll u,v,w,nxt;}e[N<<1];inline ll read(){ ll x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){
if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f;}inline void add(int u,int v,ll w){ e[++cnt].v=v;e[cnt].w=w;e[cnt].nxt=head[u];head[u]=cnt;}ll min_(ll a,ll b){
return a

 

 

转载于:https://www.cnblogs.com/L-Memory/p/9878194.html

你可能感兴趣的文章
获取各种类型的节点
查看>>
表达式求值-201308081712.txt
查看>>
centos中安装tomcat6
查看>>
从Vue.js窥探前端行业
查看>>
学习进度
查看>>
poj3368 RMQ
查看>>
“此人不存在”
查看>>
github.com加速节点
查看>>
解密zend-PHP凤凰源码程序
查看>>
python3 序列分片记录
查看>>
Atitit.git的存储结构and 追踪
查看>>
atitit 读书与获取知识资料的attilax的总结.docx
查看>>
B站 React教程笔记day2(3)React-Redux
查看>>
找了一个api管理工具
查看>>
C++——string类和标准模板库
查看>>
zt C++ list 类学习笔记
查看>>
git常用命令
查看>>
探讨和比较Java和_NET的序列化_Serialization_框架
查看>>
1、jQuery概述
查看>>
数组比较大小的几种方法及math是方法
查看>>