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 |
为什么RE#include <iostream> #include <cstdio> using namespace std; int n, C, M, K; int dist[235][235]; const int inf = 1000000009; #define MAXN 235 #define MAXE 12500 #define inf 0x3f3f3f3f struct Edge{ int v,c,x; }E[MAXE]; //指向的节点, 剩余可增⼲⼴广的流量 int l[MAXN],e; //必须保证e的初始值是偶数 void init(){ e=0; memset(l,-1,sizeof(l)); } int l[MAXN],e; //必须保证e的初始值是偶数 void init(){ e=0; memset(l,-1,sizeof(l)); } inline void insert(int u,int v,int f,int invf){ //u->v=f E[e].v=v; E[e].c=f; E[e].x=l[u]; l[u]=e++; E[e].v=u; E[e].c=invf;E[e].x=l[v]; l[v]=e++; } struct Netflow{ int src,sink; //需要初始化 //以上 int L[MAXN],Q[MAXN]; //L=level Q=queue int _bfs(){ //广搜,并标记level(只取流量⼤大于0的边) int s=0,t=0,u; memset(L,0xff,sizeof(L)); L[src]=0; Q[t++]=src; while (s<t){ u=Q[s++]; for (int p=l[u];p>=0;p=E[p].x) if (E[p].c && L[E[p].v]==-1) L[(Q[t++]=E[p].v)]=L[u]+1; } return L[sink]!=-1; } int _find(int u,int in){ //in:能流⼊入u节点的最⼤大流量. 返回u节点能流出的最⼤大流量 if (u==sink) return in; int t,w=0; //w表⽰示已经从u流出的总流量 for (int p=l[u];p>=0 && w<in;p=E[p].x){ if (E[p].c>0 && L[E[p].v]==L[u]+1){ if (t=_find(E[p].v,min(E[p].c,in-w))){ E[ p].c-=t; E[p^1].c+=t; //这⾥里表⽰示必须 w+=t; //多路增⼲⼴广优势巨⼤大 } } } if( w<in )L[u]=-1;//关键的⼀一句话 return w; } int dinic(){ int t,res=0; while (_bfs()) { while (t=_find(src,inf))res+=t; } return res; } }flow; //********模板结束*********** //init(); insert(...); flow.src=.. ; flow.sink; flow.dinic(); bool check(int max_dist) { init(); //1-K machines, K+1 - K+C, cows, C+K+1 source, C+K+2 sink for (int i = 0; i < K; ++i) { for (int j = K; j < K + C; ++j) { //j cows, i machines if (dist[i][j] <= max_dist) { insert(j + 1, i + 1, inf, 0); } } } flow.src = K + C + 1; flow.sink = K + C + 2; for (int i = 1; i <= K; ++i) { insert(i, flow.sink, M, 0); } for (int i = K + 1; i <= K + C; ++i) { insert(flow.src, i, 1, 0); } int max_flow = flow.dinic(); if (max_flow == C) { return true; } return false; } int main() { while (scanf("%d%d%d", &K, &C, &M) != EOF) { for (int i = 0; i < K + C; ++i) { for (int j = 0; j < K + C; ++j) { scanf("%d", &dist[i][j]); if (dist[i][j] == 0) dist[i][j] = inf; if (i == j) dist[i][j] = 0; } } for (int k = 0; k < K + C; ++k) { for (int i = 0; i < K + C; ++k) { if (k == i) continue; for (int j = 0; j < K + C; ++j) { if (i == j || k == j) continue; if (dist[i][k] + dist[k][j] <= dist[i][j]) { dist[i][j] = dist[i][k] + dist[k][j]; } } } } int L = 0, R = inf; while (L < R) { int mid = L + (R - L) / 2; bool flag = check(mid); if (flag) { R = mid; } else { L = mid; } } int max_distance = L; printf("%d\n", max_distance); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator