Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
求纠错#include "stdio.h" #define inf 1000000 #define maxk 32 #define maxc 202 int head[maxk+maxc+2],flag[maxk+maxc+2],level[maxk+maxc+2],n,m,vs,vt,m1,k,c; int dist[maxk+maxc][maxk+maxc]; struct hp { int c,f,to,next; }edge[(maxk+maxc+2)*(maxk+maxc+2)]; int bfs() { int i,front,rear,u,v,queue[maxk+maxc]; memset(flag,0,sizeof(flag)); flag[vs]=1; level[vs]=0; front=-1; rear=0; queue[rear]=vs; while(front<rear) { front++; u=queue[front]; if(u==vt) return 1; for(i=head[u];i!=-1;i=edge[i].next) { v=edge[i].to; if(flag[v]==0 && edge[i].c>edge[i].f) { flag[v]=1; level[v]=level[u]+1; rear++; queue[rear]=v; } } } return 0; } int min(int a,int b) { if(a>b) return b; return a; } int dfs(int u,int a) { int i,v,flow,sum=a; if(u==vt) return a; for(i=head[u];i!=-1;i=edge[i].next) { v=edge[i].to; if(level[v]==level[u]+1 && edge[i].f<edge[i].c) { flow=dfs(v,min(a,edge[i].c-edge[i].f)); edge[i].f+=flow; edge[i-1].f-=flow; a-=flow; } } return sum-a; } void dinic() { while(bfs()) dfs(vs,inf); } void floyd() { int i,j,t; for(t=1;t<=k+c;t++) for(i=1;i<=k+c;i++) for(j=1;j<=k+c;j++) if(t!=i && t!=j && dist[i][t]!=inf && dist[t][j]!=inf && dist[i][j]-dist[t][j]>dist[i][t]) dist[i][j]=dist[t][j]+dist[i][t]; } void init() { int i,j,dis; memset(head,0xff,sizeof(head)); memset(edge,0,sizeof(edge)); scanf("%d%d%d",&k,&c,&m); for(i=0;i<=(k+c+2)*(k+c+2)-1;i++) edge[i].next=-1; vs=0; vt=k+c+1; for(i=1;i<=k+c;i++) for(j=1;j<=k+c;j++) { scanf("%d",&dis); if(dis==0) dist[i][j]=inf; else dist[i][j]=dis; } floyd(); n=k+c; } void build(int x) { int m1=0,i,j; memset(edge,0,sizeof(edge)); memset(head,0xff,sizeof(head)); for(i=1;i<=k;i++) { edge[m1].c=m; edge[m1].next=head[vs]; edge[m1].to=i; head[vs]=m1; m1++; edge[m1].c=0; edge[m1].next=head[i]; edge[m1].to=vs; head[i]=m1; m1++; } for(i=k+1;i<=k+c;i++) { edge[m1].c=1; edge[m1].next=head[i]; edge[m1].to=vt; head[i]=m1; m1++; edge[m1].c=0; edge[m1].next=head[vt]; edge[m1].to=i; head[vt]=m1; m1++; } for(i=1;i<=k;i++) for(j=k+1;j<=k+c;j++) { if(dist[i][j]<=x) { edge[m1].c=inf; edge[m1].next=head[i]; edge[m1].to=j; head[i]=m1; m1++; edge[m1].c=0; edge[m1].next=head[j]; edge[m1].to=i; head[j]=m1; m1++; } } } void work() { int t,sign=0,i,j,max=0,min=inf,w,maxflow=0,x; for(i=1;i<=n;i++) for(j=i+1;j<=n;j++) { if(dist[i][j]>max && dist[i][j]<inf) max=dist[i][j]; if(dist[i][j]<min) min=dist[i][j]; } t=m1; while(1) { m1=t; x=(max+min)/2; build(x); dinic(); maxflow=0; for(w=head[vs];w!=-1;w=edge[w].next) maxflow+=edge[w].f; if(maxflow==c) max=x; else min=x+1; if(max==min) break; } printf("%d",min); } int main() { init(); work(); return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator