监狱逃离 51nod1299 最小割
生活随笔
收集整理的這篇文章主要介紹了
监狱逃离 51nod1299 最小割
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題目大意
監(jiān)獄有N條道路連接N + 1個交點,編號0至N,整個監(jiān)獄被這些道路連在一起(任何2點之間都有道路),人們通過道路在交點之間走來走去。其中的一些交點只有一條路連接,這些點是監(jiān)獄的出口。在各個交點中有M個點住著犯人(M <= N + 1),剩下的點可以安排警衛(wèi),有警衛(wèi)把守的地方犯人無法通過。給出整個監(jiān)獄的道路情況,以及犯人所在的位置,問至少需要安排多少個警衛(wèi),才能保證沒有1個犯人能夠逃到出口,如果總有犯人能夠逃出去,輸出-1。
分析
在olahiuj的安利下做了這題。
正解應該是樹形dp之類的東東。。。
但是我們也可以用最小割寫。。。(不知為何10^5的數(shù)據(jù)dinic居然能過)
建圖:
1.如果i和j有邊相連(i,j’,∞)(j,i’,∞)
2.如果i有犯人(s,i,∞)
3.如果i是出口(i,t,∞)
4.把i點拆成入點和出點(i’,i,1)
code
#include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<queue>using namespace std;struct arr{int x,y,w,next; }edge[2000000];int ls[410000],cur[410000]; int f[2100000]; int edge_m=1; int n,m,s,t; int ans,num=0;void add(int x,int y,int w) {edge[++edge_m]=(arr){x,y,w,ls[x]}; cur[y]=ls[x]=edge_m; f[edge_m]=w;edge[++edge_m]=(arr){y,x,w,ls[y]}; cur[y]=ls[y]=edge_m; f[edge_m]=0; }int dis[400000];bool bfs() {memset(dis,-1,sizeof(dis));queue<int> q;q.push(s);dis[s]=0;do{int x=q.front();q.pop();for (int i=ls[x];i!=0;i=edge[i].next){if ((f[i])&&(dis[edge[i].y]==-1)){dis[edge[i].y]=dis[x]+1;q.push(edge[i].y);if (edge[i].y==t) return true;}}}while (!q.empty());return false; }int find(int x,int min_) {if (x==t) return min_;int rec=min_;for (int &i=cur[x];i!=0;i=edge[i].next){if ((f[i])&&(dis[edge[i].y]==dis[x]+1)){int k=find(edge[i].y,min(min_,f[i]));f[i]-=k;f[i^1]+=k;rec-=k;if (rec==0) return min_;}}if (rec==min_) dis[x]=-1;return min_-rec; }int dinic() {ans=0;while (bfs()){for (int i=0;i<=t;i++) cur[i]=ls[i];ans+=find(s,20000000);} }int a[410000]; int du[410000];int main() {scanf("%d%d",&n,&m);for (int i=1;i<=n;i++){int x,y;scanf("%d%d",&x,&y);du[x]++; du[y]++;add(x,y+n+1,410000);add(y,x+n+1,410000);}for (int i=1;i<=m;i++){int x;scanf("%d",&x);a[x]=1;}n++;s=n*2+1; t=n*2+2;for (int i=0;i<=n;i++){if (a[i]) add(s,i,410000);else add(i+n,i,1);if (du[i]==1) add(i,t,410000);}dinic();if (ans==410000) printf("-1");else printf("%d",ans); }總結
以上是生活随笔為你收集整理的监狱逃离 51nod1299 最小割的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 51Nod-1299-监狱逃离
- 下一篇: 51nod 1299 监狱逃离 树形D