POJ 2426 Interesting Housing Problem (最大费用最大流)
POJ 2426 Interesting Housing Problem (最大费用最大流)
#include <iostream> #include <cstdio> #include <queue> #include <cstdlib> using namespace std; const int maxn=30000; const int inf=200000000; struct edge{ int u,v,next,f,c; edge(int u0=0,int v0=0,int f0=0,int c0=0,int next0=0){ u=u0,v=v0,f=f0,c=c0,next=next0; } }e[maxn*10]; int head[maxn*2],visited[maxn*2],path[maxn*2],dist[maxn*2]; int cnt,from,to,marked,maxflow,offflow,n,r,m,casen; void initial(){ to=2*n+2*r+1;casen++; cnt=0;marked=1; maxflow=0;from=0; for(int i=0;i<=to;i++){ head[i]=-1; visited[i]=0; } } void adde(int u,int v,int f,int c){ e[cnt].u=u,e[cnt].v=v,e[cnt].f=f,e[cnt].c=c,e[cnt].next=head[u],head[u]=cnt++; e[cnt].u=v,e[cnt].v=u,e[cnt].f=0,e[cnt].c=-c,e[cnt].next=head[v],head[v]=cnt++; } void input(){ for(int i=1;i<=n;i++){ adde(0,i,1,0); adde(i,i+n,1,0); } for(int i=1;i<=r;i++){ adde(2*n+i,2*n+r+i,1,0); adde(2*n+r+i,to,1,0); } while(m-- >0){ int u0,v0,c0; scanf("%d%d%d",&u0,&v0,&c0); if(c0>=0) adde(u0+1+n,2*n+v0+1,1,c0); } } void bfs(){ for(int i=0;i<=to;i++){ dist[i]=-inf; path[i]=-1; } dist[0]=0; queue <int> q; q.push(0); marked++; visited[0]=marked; while(!q.empty()){ int s=q.front(); q.pop(); for(int i=head[s];i!=-1;i=e[i].next){ int d=e[i].v; if(e[i].f>0 && dist[s]+e[i].c>dist[d]){ dist[d]=dist[s]+e[i].c; path[d]=i; if(visited[d]!=marked){ visited[d]=marked; q.push(d); } } } visited[s]=-1; } } void computing(){ printf("Case %d: ",casen); if(r<n){ cout<<"-1"<<endl; return; } for(int k=0;k<n;k++){ bfs(); /*cout<<to; for(int i=to;i!=from;i=e[path[i]].u){ cout<<"->"<<e[path[i]].u; } cout<<" ans:"<<dist[to]<<endl;*/ if(dist[to]<=-inf){ cout<<"-1"<<endl; return; } maxflow+=dist[to]; for(int i=to;i!=from;i=e[path[i]].u){ e[path[i]].f-=1; e[path[i]^1].f+=1; } } printf("%d\n",maxflow); } int main(){ while(cin>>n>>r>>m){ initial(); input(); computing(); } return 0; }