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;
}
浙公网安备 33010602011771号