poj 3422

费用流,数据很水。

代码:

#include<iostream>
#include<fstream>

using namespace std;
#define oo 10000000
typedef struct e{
	int data;
	 e *next,*opt;
	int c,cost;
	 
}e;
e edge[5003];

int n,m;

int v[5003],d[5003];
int path[5003];
e *path1[5003];
int spfa(){
	int queue[5005],i,j,k;

	memset(v,0,sizeof(v));
	for(i=0;i<=n*n*2+1;i++)
		d[i]=-oo;
	int front=0,end=1;
	queue[0]=n*n*2;
	v[n*n*2]=1;
	d[n*n*2]=0;
	path[n*n*2]=-1;
	while(front!=end)
	{	
		i=queue[front];
		front=(front+1)%5005;
		v[i]=0;
		e *p=edge[i].next;
		while(p){
			if(p->c>0&&d[p->data]<d[i]+p->cost)
			{
				d[p->data]=d[i]+p->cost;
				path[p->data]=i;
				path1[p->data]=p;
				if(v[p->data]==0)
				{
					v[p->data]=1;
					queue[end]=p->data;
					end=(end+1)%5005;
				}
			}

			p=p->next;
		}
	}
	if(d[n*n*2+1]==-oo)
		return 0;
	return 1;
}

void solve(){
	int i,j,k=0;
	
	while(spfa())
	{
		i=oo;
		j=n*n*2+1;
		
		while(j!=n*n*2)
		{
			if(i>path1[j]->c)
				i=path1[j]->c;
			j=path[j];
		}
		j=n*n*2+1;
		while(j!=n*n*2)
		{
			path1[j]->c-=i;
			path1[j]->opt->c+=i;
			j=path[j];
		}
		k+=i*d[n*n*2+1];
	}
	cout<<k<<endl;
}

void read(){
//	ifstream cin("in.txt");
	int i,j,k,s,t;
	cin>>n>>m;
	for(i=0;i<n;i++)
		for(j=0;j<n;j++)
		{
			s=i*n+j;
			t=n*n+s;
			cin>>k;
			e *p=new e;
			p->data=t;
			p->c=1;
			p->cost=k;
			p->next=edge[s].next;
			edge[s].next=p;

			e *p1=new e;
			p1->data=t;
			p1->c=oo;
			p1->cost=0;
			p1->next=edge[s].next;
			edge[s].next=p1;

			e *q=new e;
			q->data=s;
			q->c=0;
			q->cost=0;
			q->next=edge[t].next;
			edge[t].next=q;
			
			e *q1=new e;
			q1->data=s;
			q1->c=0;
			q1->cost=-k;
			q1->next=edge[t].next;
			edge[t].next=q1;

			p->opt=q1;
			p1->opt=q;
			q->opt=p1;
			q1->opt=p;
		}
	for(i=0;i<n;i++)
		for(j=0;j<n;j++)
		{
			if(i+1<n) {
				s=i*n+j+n*n;
				t=(i+1)*n+j;
				e *p=new e;
				p->data=t;
				p->c=oo;
				p->cost=0;
				p->next=edge[s].next;
				edge[s].next=p;
				
				e *q=new e;
				q->data=s;
				q->c=0;
				q->cost=0;
				q->next=edge[t].next;
				edge[t].next=q;
				q->opt=p;
				p->opt=q;
			}
			if(j+1<n)
			{
				s=i*n+j+n*n;
				t=i*n+j+1;
				e *p=new e;
				p->data=t;
				p->c=oo;
				p->cost=0;
				p->next=edge[s].next;
				edge[s].next=p;
				
				e *q=new e;
				q->data=s;
				q->c=0;
				q->cost=0;
				q->next=edge[t].next;
				edge[t].next=q;
				q->opt=p;
				p->opt=q;
			}
		}
	e *p=new e;
	p->data=0;
	p->c=m;
	p->cost=0;
	p->next=edge[n*n*2].next;
	edge[n*n*2].next=p;

	e *q=new e;
	q->data=n*n*2;
	q->c=0;
	q->cost=0;
	q->next=edge[0].next;
	edge[0].next=q;
	p->opt=q;
	q->opt=p;
	{
	e *p=new e;
	p->data=n*n*2-1;
	p->c=0;
	p->cost=0;
	p->next=edge[n*n*2+1].next;
	edge[n*n*2+1].next=p;

	e *q=new e;
	q->data=n*n*2+1;
	q->c=m;
	q->cost=0;
	q->next=edge[n*n*2-1].next;
	edge[n*n*2-1].next=q;
	p->opt=q;
	q->opt=p;
	}
	solve();

}


int main(){
	read();
	return 0;
}

posted on 2011-03-23 18:52  宇宙吾心  阅读(457)  评论(0)    收藏  举报

导航