POJ 3422 Kaka's Matrix Travels (最大费用最大流)

POJ 3422 Kaka's Matrix Travels (最大费用最大流)


#include <iostream>
#include <cstdio>
#include <queue>
#include <cstdlib>
using namespace std;

const int maxn=20000;
const int inf=20000000;
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,m;

void initial(){
	for(int i=0;i<2*maxn;i++){
		head[i]=-1;
		visited[i]=0;
	}
	cnt=0;
	marked=1;
	maxflow=0;
	from=0;
	to=2*n*n+1;
}

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(){
	int cnt=n*n,cf;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			scanf("%d",&cf);
			int u=(i-1)*n+j;
			adde(u,u+cnt,1,cf);//拆点 
			adde(u,u+cnt,inf,0);
			if(i<n) adde(u+cnt,u+n,inf,0);//向下 
			if(j<n) adde(u+cnt,u+1,inf,0);//向右
		}
	}
	adde(0,1,m,0);
	adde(2*cnt,to,m,0);	
}

void bfs(){
	 for(int i=0;i<2*maxn;i++){
	 	dist[i]=-inf;
	 	path[i]=-1;
	 }
	 dist[0]=0;
     int s=0,d;
     queue <int> q;
     q.push(s);
     marked++;
     visited[s]=marked;
     while(!q.empty()){
         s=q.front();
         q.pop();
         visited[s]=-1;
         for(int i=head[s];i!=-1;i=e[i].next){
              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);
                 }
              }
         }
     }
}

void computing(){
     for(int k=0;k<m;k++){ 
     	bfs();
		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>>m){
		initial();
		input();
		computing();
	}
	return 0;
}


posted @ 2013-08-22 12:56  炒饭君  阅读(169)  评论(0编辑  收藏  举报