NC24843. [USACO 2009 Mar G]Earthquake Damage 2
描述
输入描述
* Line 1: Three space-separated integers: P, C, and N
* Lines 2..C+1: Line i+1 describes cowpath i with two integers: and
* Lines C+2..C+N+1: Line C+1+j contains a single integer:
输出描述
* Line 1: A single integer that is the minimum count of pastures from which a cow can not return to the barn (including the damaged pastures themselves)
示例1
输入:
5 5 2 1 2 2 3 3 5 2 4 4 5 4 5
输出:
1
说明:
Only pasture 2 being damaged gives such a scenario.C++14(g++5.4) 解法, 执行用时: 32ms, 内存消耗: 4068K, 提交时间: 2019-09-11 14:23:47
# include<iostream> # include<cstdio> # include<cstring> # include<queue> using namespace std; const int t=500000; struct q{ int x,y,dis; }c[6000001]; int p,C,n,num; int h[600001],d[600001]; bool use[3001]; void add(int x,int y,int dis) { c[num].x=h[x]; c[num].y=y; c[num].dis=dis; h[x]=num++; } bool bfs() { queue<int> qu; qu.push(0); memset(d,0,sizeof(d)); d[0]=1; while(!qu.empty()) { int tt=qu.front(); qu.pop(); for(int i=h[tt];i;i=c[i].x) if(!d[c[i].y]&&c[i].dis) { d[c[i].y]=d[tt]+1; qu.push(c[i].y); } } return d[t]; } int dfs(int x,int dix) { if(x==t) return dix; int sum=0; for(int i=h[x];i;i=c[i].x) if(d[c[i].y]==d[x]+1&&c[i].dis) { int dis=dfs(c[i].y,min(dix,c[i].dis)); if(dis) { sum+=dis; dix-=dis; c[i].dis-=dis; c[i^1].dis+=dis; if(!dix) break; } } return sum; } int dinic() { int tot=0; while(bfs()) tot+=dfs(0,1e8); return tot; } int main() { scanf("%d%d%d",&p,&C,&n); add(1,0,0); add(0,1,1e8); add(1+p,1,0); add(1,1+p,1e8); for(int i=1;i<=C;i++) { int x,y; scanf("%d%d",&x,&y); add(x,y+p,0); add(y+p,x,1e8); add(y,x+p,0); add(x+p,y,1e8); } for(int i=1;i<=n;i++) { int x; scanf("%d",&x); use[x]=1; add(x+p,x,0); add(x,x+p,1e8); add(t,x+p,0); add(x+p,t,1e8); } for(int i=2;i<=p;i++) if(!use[i]) { add(i+p,i,0); add(i,i+p,1); } printf("%d",dinic()); return 0; }
C++11(clang++ 3.9) 解法, 执行用时: 30ms, 内存消耗: 1636K, 提交时间: 2019-09-07 10:47:35
#pragma GCC optimize(2) #include<bits/stdc++.h> //#define int long long using namespace std; const int inf=0x3f3f3f3f; const int N=10010,M=100010; int n,m,p,h[N],base,s,t; int head[N],to[M],w[M],nex[M],tot=1; inline void ade(int a,int b,int c){ to[++tot]=b; w[tot]=c; nex[tot]=head[a]; head[a]=tot; } inline void add(int a,int b,int c){ ade(a,b,c); ade(b,a,0); } int bfs(){ memset(h,0,sizeof h); h[s]=1; queue<int> q; q.push(s); while(q.size()){ int u=q.front(); q.pop(); for(int i=head[u];i;i=nex[i]){ if(w[i]&&!h[to[i]]){ h[to[i]]=h[u]+1; q.push(to[i]); } } } return h[t]; } int dfs(int x,int f){ if(x==t) return f; int fl=0; for(int i=head[x];i&&f;i=nex[i]){ if(h[to[i]]==h[x]+1&&w[i]){ int mi=dfs(to[i],min(w[i],f)); w[i]-=mi; w[i^1]+=mi; fl+=mi; f-=mi; } } if(!fl) h[x]=-1; return fl; } int dinic(){ int res=0; while(bfs()) res+=dfs(s,inf); return res; } signed main(){ cin>>n>>m>>p; t=1; s=0; while(m--){ int a,b; cin>>a>>b; if(a==b) continue; add(a+n,b,inf); add(b+n,a,inf); } while(p--){ int a; cin>>a; add(s,a,inf); add(a,a+n,inf); add(a+n,a,inf); } for(int i=2;i<=n;i++) add(i,i+n,1),add(i+n,i,1); cout<<dinic()<<endl; return 0; }