bzoj 1585: [Usaco2009 Mar]Earthquake Damage 2 地震伤害
1585: [Usaco2009 Mar]Earthquake Damage 2 地震伤害
Description
Farmer John的农场里有P个牧场,有C条无向道路连接着他们,第i条道路连接着两个牧场Ai和Bi,注意可能有很多条道路连接着相同的Ai和Bi,并且Ai有可能和Bi相等。Farmer John在1号牧场里。由于地震,某些牧场被损坏,但由于信春哥,C条道路没有一条损坏。有N头奶牛,他们在不同的牧场里,于是N <= P。他们一一向Farmer John报告。第i头奶牛报告给Farmer John一个整数Report_i,代表第Report_i个牧场没有损毁,但不能够从第Report_i个牧场经过一些没有损坏的牧场到达1号牧场。现在Farmer John想知道,最少有多少损坏的牧场。
Input
第一行三个整数 P,C,N
第2..C+1行:每行两个整数Ai,Bi
第C+2..C+N+1行:第C+1+i行包含一个整数,Report_i
Output
一个整数,代表最少有多少损坏的牧场
Sample Input
1 2
2 3
3 5
2 4
4 5
4
5
Sample Output
【数据规模】
1 <= P <=3000
1 <= C <=20000
题解:
拆点,最小割。。。
由于1到不了给定的一些点,那么就是求图中的割,将给定的点向T连一条边权无穷大的边,保证割使1和这些点分离。。
题目中还说给定的点没有毁坏,以此将一个点x裂成x,x'
若是1或是给定的点,x->x' ∞
反之x->x' 1
对于相邻的<x,y>
x'->y ∞
y'->x ∞
#include<stdio.h>
#include<iostream>
using namespace std;
const int N=6005;
const int M=100005;
int n,m,k,i,x,y,src,tar,ans,dis[N],gap[N],p[N];
int tot,head[N],Next[M],to[M],v[M];
void add(int x,int y,int z)
{
to[tot]=y;
v[tot]=z;
Next[tot]=head[x];
head[x]=tot++;
}
inline void read(int &v){
char ch,fu=0;
for(ch='*'; (ch<'0'||ch>'9')&&ch!='-'; ch=getchar());
if(ch=='-') fu=1, ch=getchar();
for(v=0; ch>='0'&&ch<='9'; ch=getchar()) v=v*10+ch-'0';
if(fu) v=-v;
}
int isap(int x,int s)
{
if(x==tar) return s;
int flow=0,i,Min=n-1;
for(i=head[x];i!=-1;i=Next[i])
{
int y=to[i];
if(v[i]>0)
{
if(dis[x]==dis[y]+1)
{
int tmp=isap(y,min(s-flow,v[i]));
flow+=tmp;
v[i]-=tmp;
v[i^1]+=tmp;
}
Min=min(Min,dis[y]);
}
if(flow==s) return flow;
if(dis[src]==n) return flow;
}
if(flow==0)
{
gap[dis[x]]--;
if(gap[dis[x]]==0) dis[src]=n;
dis[x]=Min+1;
gap[dis[x]]++;
}
return flow;
}
int main()
{
read(n),read(m),read(k);
for(i=1;i<=n*2+2;i++) head[i]=-1;
src=n*2+1,tar=n*2+2;
add(src,1,1e9);add(1,src,0);
for(i=1;i<=m;i++)
{
read(x),read(y);
add(x+n,y,1e9);add(y,x+n,0);
add(y+n,x,1e9);add(x,y+n,0);
}
for(i=1;i<=k;i++)
{
read(x);
add(x+n,tar,1e9);
add(tar,x+n,0);
p[x]=1;
}
for(i=1;i<=n;i++)
{
if(i==1||p[i])
{
add(i,i+n,1e9);
add(n+i,i,0);
} else
{
add(i,n+i,1);
add(n+i,i,0);
}
}
n=n*2+2;
gap[0]=n;
while(dis[src]<n)
ans+=isap(src,1e9);
cout<<ans;
return 0;
}
bzoj 1585: [Usaco2009 Mar]Earthquake Damage 2 地震伤害的更多相关文章
- bzoj 1585: [Usaco2009 Mar]Earthquake Damage 2 地震伤害【最小割】
枚举建图.jpg 一开始建的图挂了,于是枚举了几种建图方式-- 因为要删点,所以拆点,连接(i,i',1),对于原来图上的边(u,v),连接(u',v,inf),(v',u,inf),然后连接(s,i ...
- 【BZOJ】1585: [Usaco2009 Mar]Earthquake Damage 2 地震伤害
[题意]给定无向图,现在可能有一些点已经被删除,只给出信息是c个点未被删除且不能到达结点1,求最少的删除点个数. [算法]最小割 [题解]本题和1的区别是:1求的是最少的不能到达1的结点数,那么就把损 ...
- 【bzoj1585】[Usaco2009 Mar]Earthquake Damage 2 地震伤害 网络流最小割
题目描述 Farmer John的农场里有P个牧场,有C条无向道路连接着他们,第i条道路连接着两个牧场Ai和Bi,注意可能有很多条道路连接着相同的Ai和Bi,并且Ai有可能和Bi相等.Farmer J ...
- BZOJ1585: [Usaco2009 Mar]Earthquake Damage 2 地震伤害
n<=3000个点m<=20000条无向边的图,有p<=n个出发点,每个出发点都不可拆,现拆一些点使每个出发点都不能到达点1,求最小点数. 简单的最小割.每个点拆成两个x和y,无向边 ...
- BZOJ 1585: Earthquake Damage 2 地震伤害 网络流 + 最小割
Description Farmer John的农场里有P个牧场,有C条无向道路连接着他们,第i条道路连接着两个牧场Ai和Bi,注意可能有很多条道路连接着相同的Ai和Bi,并且Ai有可能和Bi相等.F ...
- [Usaco2009 MAR] Earthquake Damage 2
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1585 [算法] 一个最小割的经典模型 , 详见代码 时间复杂度 : O(dinic( ...
- DP经典 BZOJ 1584: [Usaco2009 Mar]Cleaning Up 打扫卫生
BZOJ 1584: [Usaco2009 Mar]Cleaning Up 打扫卫生 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 419 Solve ...
- bzoj 3399: [Usaco2009 Mar]Sand Castle城堡
3399: [Usaco2009 Mar]Sand Castle城堡 Time Limit: 3 Sec Memory Limit: 128 MB Description 约翰用沙子建了一座城堡.正 ...
- BZOJ 3401: [Usaco2009 Mar]Look Up 仰望( 单调栈 )
n <= 105 , 其实是10 ^ 5 ....坑...我一开始写了个模拟结果就 RE 了.. 发现这个后写了个单调栈就 A 了... ---------------------------- ...
随机推荐
- spring mvc 提供的几个常用的扩展点
转载 :http://blog.csdn.net/gufachongyang02/article/details/43836105 这是spring3 mvc的核心流程图: SpirngMVC的第 ...
- 64_m2
mimetic-devel-0.9.8-7.fc26.i686.rpm 12-Feb-2017 05:40 288474 mimetic-devel-0.9.8-7.fc26.x86_64.rpm 1 ...
- python爬虫模块之HTML下载模块
HTML下载模块 该模块主要是根据提供的url进行下载对应url的网页内容.使用模块requets-HTML,加入重试逻辑以及设定最大重试次数,同时限制访问时间,防止长时间未响应造成程序假死现象. 根 ...
- 【数位dp入门】【HDU2089】62
为了我的点歪的技能树…… 所以开始补一些sb的东西…… #include<bits/stdc++.h> typedef long long ll; using namespace std; ...
- c#中char、string转换为十六进制byte的浅析
问题引出: string转换为byte(十六进制) static void Main(string[] args) { "; byte[] b = Encoding.Default.GetB ...
- P1968
题目背景 此处省略maxint+1个数 题目描述 在以后的若干天里戴维将学习美元与德国马克的汇率.编写程序帮助戴维何时应买或卖马克或美元,使他从100美元开始,最后能获得最高可能的价值. 输入输出格式 ...
- Django在根据models生成数据库表时报错
报错信息: E:\Python\s6day103>python manage.py makemigrations Traceback (most recent call last): File ...
- sql server 2008 R2连接失败 错误:18456
这种问题的解决方法: 第一步:以windows验证模式进入数据库管理器. 第二步:在对新资源管理器中右击实例名称选择属性,弹出服务器属性对话框,我们在左侧栏选择[安全性]选项卡,选中”SQL Serv ...
- redis之(一)redis的简单介绍
[一]:概念 --->Redis是一个开源的,高性能的,基于键值对的缓存与存储系统 --->Redis数据库中的多有数据都存储在内存中,由于内存的读写速度远快于硬盘,一秒读写超过10万键值 ...
- Python基础系列----函数,面向对象,异常
1.前言 前 ...