BZOJ1585: [Usaco2009 Mar]Earthquake Damage 2 地震伤害

n<=3000个点m<=20000条无向边的图,有p<=n个出发点,每个出发点都不可拆,现拆一些点使每个出发点都不能到达点1,求最小点数。

简单的最小割。每个点拆成两个x和y,无向边A--B即Ay->Bx,By->Ax,每个点拆成的x和y再连边容量1,然后建超级源向p个点连边,最大流,没了。

错误。没看题。p个点不可割。WA了一发。正确做法只要把p个点的x->y的边容量设inf即可。

  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<algorithm>
  4 #include<cstdlib>
  5 #include<math.h>
  6 //#include<iostream>
  7 using namespace std;
  8
  9 int n,m,p;
 10 #define maxn 6011
 11 #define maxm 100011
 12 const int inf=0x3f3f3f3f;
 13 struct Network
 14 {
 15     struct Edge{int to,next,cap,flow;}edge[maxm];
 16     int first[maxn],le,n;
 17     void clear(int n)
 18     {
 19         memset(first,0,sizeof(first));
 20         le=2;this->n=n;
 21     }
 22     void in(int x,int y,int cap)
 23     {
 24         Edge &e=edge[le];
 25         e.to=y;e.cap=cap;e.flow=0;
 26         e.next=first[x];first[x]=le++;
 27     }
 28     void insert(int x,int y,int cap)
 29     {
 30         in(x,y,cap);
 31         in(y,x,0);
 32     }
 33     int s,t,que[maxn],head,tail,dis[maxn],cur[maxn];
 34     bool bfs()
 35     {
 36         memset(dis,0,sizeof(dis));
 37         dis[s]=1;
 38         que[head=(tail=1)-1]=s;
 39         while (head!=tail)
 40         {
 41             const int now=que[head++];
 42             for (int i=first[now];i;i=edge[i].next)
 43             {
 44                 Edge &e=edge[i];
 45                 if (e.cap>e.flow && !dis[e.to])
 46                 {
 47                     dis[e.to]=dis[now]+1;
 48                     que[tail++]=e.to;
 49                 }
 50             }
 51         }
 52         return dis[t];
 53     }
 54     int dfs(int x,int a)
 55     {
 56         if (x==t || !a) return a;
 57         int flow=0,f;
 58         for (int &i=cur[x];i;i=edge[i].next)
 59         {
 60             Edge &e=edge[i];
 61             if (dis[e.to]==dis[x]+1 && (f=dfs(e.to,min(a,e.cap-e.flow)))>0)
 62             {
 63                 e.flow+=f;
 64                 edge[i^1].flow-=f;
 65                 flow+=f;
 66                 a-=f;
 67                 if (!a) break;
 68             }
 69         }
 70         return flow;
 71     }
 72     int Dinic(int s,int t)
 73     {
 74         this->s=s,this->t=t;
 75         int flow=0;
 76         while (bfs())
 77         {
 78             for (int i=1;i<=n;i++) cur[i]=first[i];
 79             flow+=dfs(s,0x3f3f3f3f);
 80         }
 81         return flow;
 82     }
 83 }g;
 84 int x,y;int vis[maxn];
 85 int main()
 86 {
 87     scanf("%d%d%d",&n,&m,&p);
 88     g.n=(n<<1)^1;int s=g.n,t=1;
 89     for (int i=1;i<=m;i++)
 90     {
 91         scanf("%d%d",&x,&y);
 92         g.insert(x+n,y,inf);
 93         g.insert(y+n,x,inf);
 94     }
 95     memset(vis,0,sizeof(vis));
 96     for (int i=1;i<=p;i++)
 97     {
 98         scanf("%d",&x);vis[x]=1;
 99         g.insert(s,x,inf);
100     }
101     for (int i=1;i<=n;i++) if (!vis[i]) g.insert(i,i+n,1);else g.insert(i,i+n,inf);
102     printf("%d\n",g.Dinic(s,t));
103     return 0;
104 }

时间: 2024-11-12 13:12:56

BZOJ1585: [Usaco2009 Mar]Earthquake Damage 2 地震伤害的相关文章

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头奶牛报告给Farm

【BZOJ】1585: [Usaco2009 Mar]Earthquake Damage 2 地震伤害

[题意]给定无向图,现在可能有一些点已经被删除,只给出信息是c个点未被删除且不能到达结点1,求最少的删除点个数. [算法]最小割 [题解]本题和1的区别是:1求的是最少的不能到达1的结点数,那么就把损坏点圈缩在不可达点的邻点. 本体求的是删除最少的点使c个点不可达,这样的要求就是典型的最小割. 每个点x连向x',容量为1,若是未被删除点则容量为inf. 将1的设为S,将报告点的出点连向T,问题转化为S-T最小割.

3400: [Usaco2009 Mar]Cow Frisbee Team 奶牛沙盘队

3400: [Usaco2009 Mar]Cow Frisbee Team 奶牛沙盘队 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 129  Solved: 84[Submit][Status][Discuss] Description 农夫顿因开始玩飞盘之后,约翰也打算让奶牛们享受飞盘的乐趣.他要组建一只奶牛飞盘 队.他的N(1≤N≤2000)只奶牛,每只部有一个飞盘水准指数Ri(1≤Ri≤100000).约翰要选出1只或多于1只奶牛来参加他的

bzoj3401[Usaco2009 Mar]Look Up 仰望*

bzoj3401[Usaco2009 Mar]Look Up 仰望 题意: 约翰的N头奶牛站成一排,奶牛i的身高是Hi.对于奶牛i,如果奶牛j满足i<j且Hi<Hj,我们可以说奶牛i可以仰望奶牛j.求出每只奶牛离她最近的仰望对象.n≤100000. 题解: 用一个单调栈维护即可. 代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define inc(i,j,k) f

1583: [Usaco2009 Mar]Moon Mooing 哞哞叫

1583: [Usaco2009 Mar]Moon Mooing 哞哞叫 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 244  Solved: 126[Submit][Status][Discuss] Description Input 第一行两个数,C和N 第二行3个数,a1,b1,c1 第三行3个数,a2,b2,c2 Output 一个整数代表最长的那一次嚎叫 Sample Input 3 10 4 3 3 17 8 2 Sample Out

3401: [Usaco2009 Mar]Look Up 仰望

3401: [Usaco2009 Mar]Look Up 仰望 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 136  Solved: 81[Submit][Status][Discuss] Description 约翰的N(1≤N≤105)头奶牛站成一排,奶牛i的身高是Hi(l≤Hi≤1,000,000).现在,每只奶牛都在向左看齐.对于奶牛i,如果奶牛j满足i<j且Hi<Hj,我们可以说奶牛i可以仰望奶牛j.    求出每只奶牛离她最近的仰望

动态规划 BZOJ1584 [Usaco2009 Mar] Cleaning Up 打扫卫生

1584: [Usaco2009 Mar]Cleaning Up 打扫卫生 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 511  Solved: 349[Submit][Status][Discuss] Description 有N头奶牛,每头那牛都有一个标号Pi,1 <= Pi <= M <= N <= 40000.现在Farmer John要把这些奶牛分成若干段,定义每段的不河蟹度为:若这段里有k个不同的数,那不河蟹度为k*k.

BZOJ3400: [Usaco2009 Mar]Cow Frisbee Team 奶牛沙盘队

3400: [Usaco2009 Mar]Cow Frisbee Team 奶牛沙盘队 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 89  Solved: 60[Submit][Status] Description 农夫顿因开始玩飞盘之后,约翰也打算让奶牛们享受飞盘的乐趣.他要组建一只奶牛飞盘 队.他的N(1≤N≤2000)只奶牛,每只部有一个飞盘水准指数Ri(1≤Ri≤100000).约翰要选出1只或多于1只奶牛来参加他的飞盘队.由于约翰的幸

BZOJ3399: [Usaco2009 Mar]Sand Castle城堡

3399: [Usaco2009 Mar]Sand Castle城堡 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 22  Solved: 17[Submit][Status] Description 约翰用沙子建了一座城堡.正如所有城堡的城墙,这城墙也有许多枪眼,两个相邻枪眼中间那部分叫作“城齿”.    城墙上一共有N(1≤N≤25000)个城齿,每一个都有一个高度Mi.(1≤尬≤100000).现在约翰想把城齿的高度调成某种顺序下的Bi,B2