地震破坏

时间限制: 1 Sec  内存限制: 128 MB

题目描述

威斯康星发生了一场地震!约翰的牧场遭到了打击,有一些牛棚变成了废墟,如果一间牛棚遭到
了破坏,那么所有和它相连的道路都不能使用了。
约翰有 N 个牛棚,编号为 1 到 N,有 M 条双向道路连接这些牛棚,第 i 条道路连接的牛棚是
A i 和 B i ,A i 可能等于 B i ,也可能有多条道路连接同一对牛棚。
约翰让奶牛们集中到 1 号牛棚避难。有 P 头奶牛通过手机向约翰求救,她们的遭遇类似:好消
息是她们所在的牛棚没有损坏,坏消息是由于其他的牛棚遭到破坏,所以她们找不到任何可以走到 1
号牛棚的路径。假设发送报告的第 i 头奶牛目前在牛棚 R i 里,那么以最乐观的情况来看,至少有多
少牛棚被破坏了呢?

输入

• 第一行:三个整数 N,M 和 P, 1 ≤ P ≤ N ≤ 3000, 1 ≤ M ≤ 20000
• 第二行到第 M + 1 行:第 i + 1 行有两个整数 A i 和 B i ,1 ≤ A i ,B i ≤ N
• 第 M + 2 行到第 M + P + 1 行:第 i + M + 1 行有一个整数 R i , 1 ≤ R i ≤ N,保证每个 R i 都
是不同的

输出

• 单个整数:表示至少有几个牛棚被破坏了

样例输入

5 5 2
1 2
2 3
3 5
2 4
4 5
4
5

样例输出

1

提示

最乐观的情况是只有 2 号牛棚坏了

题解:

一道比较经典的最小割,首先因为每次删除的是一个点,所以要将每个点拆开,将1节点和打电话过来的几个节点残量设为最大值,其余的为1。(为了让割边落在可以去掉的点上)这样就可以将去点转化为割边。

然后根据图的连接方式,若节点x被分为x1和x2,节点y被分为y1和y2。若x和y连接,则将x2连y1,y2连x1,残量都为最大值。

然后跑一遍网络流就可以了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<queue>
#include<stack>
#include<ctime>
#include<vector>
#define inf (2e8)
using namespace std;
int n,m,l;
struct node
{
int next,to,cap;
}edge[];
int head[],size=,a[];
void putin(int from,int to,int cap)
{
size++;
edge[size].next=head[from];
edge[size].to=to;
edge[size].cap=cap;
head[from]=size;
}
void in(int from,int to,int cap)
{
putin(from,to,cap);
putin(to,from,);
}
int dist[],numbs[];
void bfs(int src,int des)
{
int i;
queue<int>mem;
mem.push(des);
dist[des]=;numbs[]++;
while(!mem.empty())
{
int x=mem.front();mem.pop();
for(i=head[x];i!=-;i=edge[i].next)
{
int y=edge[i].to;
if(edge[i].cap==&&dist[y]==&&y!=des)
{
dist[y]=dist[x]+;
numbs[dist[y]]++;
mem.push(y);
}
}
}
return;
}
int dfs(int src,int flow,int des)
{
if(src==des)return flow;
int i,low=,mindist=n*+;
for(i=head[src];i!=-;i=edge[i].next)
{
int y=edge[i].to;
if(edge[i].cap)
{
if(dist[y]==dist[src]-)
{
int t=dfs(y,min(flow-low,edge[i].cap),des);
edge[i].cap-=t;
edge[i^].cap+=t;
low+=t;
if(dist[src]>=n*+)return low;
if(low==flow)break;
}
mindist=min(mindist,dist[y]+);
}
}
if(!low)
{
if(!(--numbs[dist[src]]))dist[]=n*+;
++numbs[dist[src]=mindist];
}
return low;
}
int ISAP(int src,int des)
{
int ans=;
bfs(src,des);
while(dist[]<n*+)ans+=dfs(src,2e8,des);
return ans;
}
int main()
{
int i,j;
memset(head,-,sizeof(head));
scanf("%d%d%d",&n,&m,&l);
for(i=;i<=m;i++)
{
int from,to;
scanf("%d%d",&from,&to);
in(n+from,to,inf);
in(n+to,from,inf);
}
for(i=;i<=l;i++){scanf("%d",&j);a[j]=;}
in(,n+,inf);
for(i=;i<=n;i++)
{
if(a[i]==){in(i,n+i,inf);in(n+i,*n+,inf);}
else in(i,n+i,);
}
in(,,inf);
int maxflow=ISAP(,n*+);
cout<<maxflow;
return ;
}

[USACO09MAR]地震损失2Earthquake Damage 2的更多相关文章

  1. P2944 [USACO09MAR]地震损失2Earthquake Damage 2(网络流)

    P2944 [USACO09MAR]地震损失2Earthquake Damage 2 $P$个点,$C$条双向边.求最少删去几个点使$N$个给定的点与点$1$分开. 显然的最小割. 将点$i$套路地拆 ...

  2. 洛谷2944 [USACO09MAR]地震损失2Earthquake Damage 2

    https://www.luogu.org/problem/show?pid=2944 题目描述 Wisconsin has had an earthquake that has struck Far ...

  3. p2944 [USACO09MAR]地震损失2Earthquake Damage 2

    传送门 分析 我们让s到1,关键点到t分别连流量为inf的边 于是我们可以考虑跑s到t的最小割 于是我们将所有点拆为两个点,关键点和1的两个点之间连inf,其余点连1 将原图的边也连上,流量为inf ...

  4. 【BZOJ1585】【Luogu2944】地震损失2(网络流)

    [BZOJ1585][Luogu2944]地震损失2(网络流) 题面 题目描述 Wisconsin has had an earthquake that has struck Farmer John' ...

  5. 【P2944】地震损失(最大流,洛谷)

    绝对难度虚高的一题 看到题目,至少损坏几个房子,开始考虑最小割,建的是双向边,所以拆点,边权除了自己与自己的之外都连inf.然后把所有求救的点都连到超级源上,跑一遍最大流就可以了. #include& ...

  6. 1574: [Usaco2009 Jan]地震损坏Damage

    1574: [Usaco2009 Jan]地震损坏Damage Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 425  Solved: 232[Subm ...

  7. bzoj 1585: [Usaco2009 Mar]Earthquake Damage 2 地震伤害

    1585: [Usaco2009 Mar]Earthquake Damage 2 地震伤害 Description Farmer John的农场里有P个牧场,有C条无向道路连接着他们,第i条道路连接着 ...

  8. 洛谷 P2932 [USACO09JAN]地震造成的破坏Earthquake Damage

    P2932 [USACO09JAN]地震造成的破坏Earthquake Damage 题目描述 Wisconsin has had an earthquake that has struck Farm ...

  9. BZOJ 1574: [Usaco2009 Jan]地震损坏Damage

    Description 农夫John的农场遭受了一场地震.有一些牛棚遭到了损坏,但幸运地,所有牛棚间的路经都还能使用. FJ的农场有P(1 <= P <= 30,000)个牛棚,编号1.. ...

随机推荐

  1. 【教程】发布NAServer到ArcGIS Server 10.4上[超详细]

    前阵子对ArcGIS API For JavaScript的网络分析有兴趣,但是不知道其数据是如何获取的. 查阅API知道,AJS的网络分析只有三个功能:最短路径(RouteTask).最近设施点(C ...

  2. 学习sql基础注入的方法

    作为一个初学者的我,经学习发现基础真的十分重要, 这个随笔是写给我自己的希望我能坚持住 当然,我也希望对其他人有点帮助 在sql注入的过程中,我越发感觉那些基础函数的重要性 其实我感觉sql注入其实就 ...

  3. PL/SQL + Oracle客户端 配置记录

    oracle一直都没怎么用. oracle pl/sql也是在别人帮助下完成配置. 这次电脑重装后,自己搞定总结了下怎么配置. 1.下载Oracle 客户端. 安装的版本是win64_11gR2_cl ...

  4. Git总结笔记3-把本地仓库推送到github

    说明:此笔记在centos 7 上完成 1.配置公钥 [root@kangvcar ~]# ssh-keygen -t rsa -C "kangvcar@126.com" [roo ...

  5. foreach底层机制

    简单例子 直接了解foreach底层有些困难,我们需要从更简单的例子着手.下面上一个简单例子: public class Simple { public static void main(String ...

  6. flume集群日志收集

    一.Flume简介 Flume是一个分布式的.高可用的海量日志收集.聚合和传输日志收集系统,支持在日志系统中定制各类数据发送方(如:Kafka,HDFS等),便于收集数据.其核心为agent,agen ...

  7. <javaScript> 数组去重的方法总结(2017年)

    现在要求去重下面这个数组: const arr = [1, 2, 3, 3, 3, '0', '1', '2', '测试', '重复', '重复', NaN, NaN, false, false]; ...

  8. git使用命令总结

    直接安装git.exegit -- version 查看当前git版本进入要创建库的文件夹 shift+右键 弹出 powerShell 弹出命令窗口 git init 初始化git管理仓库 出现一个 ...

  9. jQuery选择器的的优点

    jQuery选择器的的优点 选择器想必大家都不陌生,今天呢,我就给大家介绍一下jQuery选择器的优点: jQuery选择器更简洁的写法: jQuery完善的处理机制: jQuery选择器判断dom节 ...

  10. SimpleDateFormat使用和线程安全问题

    SimpleDateFormat 是一个以国别敏感的方式格式化和分析数据的具体类. 它允许格式化 (date -> text).语法分析 (text -> date)和标准化. Simpl ...