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 |
谁帮我看一看哪里错了啊?wa死我了#include <cstdio> #include <cstring> #define oo 2147483647 using namespace std; int k,c,m,maxe,n; int g[300][300],gt[300][300]; bool mark[300]; void ini() { int i,j,t; scanf("%d%d%d",&k,&c,&m); maxe = 0; n = k+c; for (i=1;i<=n;i++) for (j=1;j<=n;j++) gt[i][j] = oo; for (i=1;i<=n;i++) { for (j=1;j<=n;j++) { scanf("%d",>[i][j]); if (gt[i][j]>maxe) maxe = gt[i][j]; if (gt[i][j]==0) gt[i][j] = oo; } } for (t=1;t<=n;t++)//floyd求最短路 for (i=1;i<=n;i++) for (j=1;j<=n;j++) if ((gt[i][t]<oo)&&(gt[t][j]<oo)) if (gt[i][t]+gt[t][j]<gt[i][j]) { gt[i][j] = gt[i][t]+gt[k][t]; } n += 2; } int dfs_maxflow(int x,int low)//朴素的最大流算法 { int i,flow; if (x==n) return low; if (mark[x]) return 0; mark[x] = 1; for (i=1;i<=n;i++) if (g[x][i]) { if (low<g[x][i]) flow = dfs_maxflow(i,low); else flow = dfs_maxflow(i,g[x][i]); if (flow>0) { g[x][i] -= flow; g[i][x] += flow; return flow; } } return 0; } bool make(int p)//用最大流判断当前解可行性 { int i,j,ans = 0,temp = oo; memset(g,0,sizeof(g)); for (i=1;i<=k;i++) for (j=k+1;j<=k+c;j++) if (gt[i][j]<=p) { g[i][j] = 1;//如果i机器到j牛最短路<=p,容量就定为一 } for (i=1;i<=k;i++)//把源点到所有机器连容量为m的边 g[n-1][i] = m; for (i=k+1;i<=k+c;i++)//把所有奶牛到汇点连容量为1的边 g[i][n] = 1; while (temp) { memset(mark,0,sizeof(mark)); temp = dfs_maxflow(n-1,oo); ans += temp; } //printf("%d %d\n",p,ans); if (ans==c) return 1;//最大流=牛的数目就可行 return 0; } void work() { int l,r,mid; bool temp; l = 0; r = maxe+1; while (l<r) { mid = (l+r)/2; temp = make(mid); if (temp) r = mid; else l = mid+1; } printf("%d\n",l); } int main() { ini(); 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