1. 程式人生 > >「網絡流24題」2. 太空飛行計劃問題

「網絡流24題」2. 太空飛行計劃問題

-m logs 問題 getchar() getc 信息 cstring char dig

「網絡流24題」2. 太空飛行計劃問題

<題目鏈接>


最大權閉合子圖。

源點與實驗連邊權為實驗費用的有向邊;

儀器與匯點連邊權為儀器費用的有向邊;

實驗與儀器之間連邊權為INF的有向邊。

答案為所有與源點相連的邊的邊權和減去圖的最小割。

證明見國集隊員胡伯濤論文《最小割模型在信息學競賽中的應用》。

輸出路徑時,最後一次層次圖中:

與源點相連的點即選做的實驗;與匯點相連的點即選用的儀器。

註意

·讀入數據時,讀到空格繼續,否則停止。

·儀器部分的點權+50,避免兩部點權相同。

#include <algorithm>
#include <cctype>
#include <climits>
#include <cstdio> #include <cstring> #include <queue> using namespace std; const int MAXN=120,MAXM=3000; bool vis[MAXN]; int m,n,S,T,cnt,ans,head[MAXN],dis[MAXN],cur[MAXN]; struct edges { int nxt,to,w; }e[MAXM]; void AddEdge(int x,int y,int w) { e[++cnt].nxt=head[x]; e[cnt].to=y; e[cnt].w=w; head[x]=cnt; } void
AddEdges(int x,int y,int w) { AddEdge(x,y,w); AddEdge(y,x,0); } bool Read(int &x) { char c=getchar(); while(!isdigit(c)) c=getchar(); x=c^48; c=getchar(); while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=getchar(); return c==‘ ‘?1:0; } bool BFS(int
S) { queue<int> q; memset(dis,0,sizeof dis); memset(vis,0,sizeof vis); q.push(S); vis[S]=1; while(!q.empty()) { int x=q.front(); q.pop(); for(int i=head[x],t;i;i=e[i].nxt) if(e[i].w && !vis[t=e[i].to]) { dis[t]=dis[x]+1; q.push(t); vis[t]=1; } if(vis[T]) return 1; } return 0; } int DFS(int x,int k) { if(x==T) return k; int tmp=0; for(int i=cur[x],t,f;i;i=e[i].nxt) if(e[i].w && dis[t=e[i].to]==dis[x]+1 && (f=DFS(t,min(k,e[i].w)))) { cur[x]=i; e[i].w-=f; e[((i-1)^1)+1].w+=f; k-=f; tmp+=f; } if(!tmp) dis[x]=0; return tmp; } void Dinic(void) { int f; while(BFS(S)) while(memcpy(cur,head,sizeof cur),f=DFS(S,INT_MAX)) ans-=f; } int main(int argc,char *argv[]) { scanf("%d %d",&m,&n); S=0,T=n+51; for(int i=1,w,k;i<=m;++i) { scanf("%d",&w); AddEdges(S,i,w),ans+=w; bool r=0; do { r=Read(k); AddEdges(i,k+50,INT_MAX); } while(r); } for(int i=1,w;i<=n;++i) { scanf("%d",&w); AddEdges(i+50,T,w); } Dinic(); for(int i=1;i<=m;++i) if(dis[i]) printf("%d ",i); putchar(\n); for(int i=1;i<=n;++i) if(dis[i+50]) printf("%d ",i); printf("\n%d\n",ans); return 0; }

謝謝閱讀。

「網絡流24題」2. 太空飛行計劃問題