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 |
见鬼了,大神进!和网上找的程序对拍了N久找不到bug。。。但是网上程序能ac我这个不行。。。思路都是一样的最大流构圖也一样的。。。 求数据啊。。 #include <iostream> #include <stdio.h> #include <queue> using namespace std; const int MAXD = 40; const int MAXDQ = 900; int n; int win[MAXD], defeat[MAXD]; int rem[MAXD][MAXD]; int pl[MAXD]; //int npl[30]; int zdWin[MAXD]; int sy[MAXD][MAXD]; int rm[MAXDQ]; int getIdx(int i, int j){ if(i < j) return i*(n-1)+j; return j*(n-1)+i; } int mn(int a, int b){ return (a<b) ? a : b; } void init(){ for(int i = 0; i < n-1; i++){ for(int j = 0; j < n-1; j++){ sy[i][j] = 0; } } int nq = (n-1)*(n-1); for(int i = 0; i < nq; i++){ rm[i] = 0; } } int pushFlow(){ //cout << 1 << endl; int sprev[MAXD], tprev[MAXDQ]; bool sused[MAXD] = {0}, tused[MAXDQ] = {0}; int TOU = 5000; int zh = -1000; queue<int> bfs; for(int i = 0; i < n-1; i++){ if(zdWin[i] > 0){ sprev[i] = TOU; sused[i] = 1; bfs.push(i); } } while(!bfs.empty()){ //cout << 1 << endl; int top = bfs.front(); bfs.pop(); if(top >= 0){ for(int i = 0; i < n-1; i++){ if(i == top) continue; int idx = getIdx(top, i); if(tused[idx]) continue; tused[idx] = 1; tprev[idx] = top; if(rm[idx] > 0){ zh = idx; goto done; } bfs.push(-idx); } } else{ int Top = -top; int i1 = Top/(n-1), i2 = Top%(n-1); if(!sused[i1] && (sy[i1][i2]>0)){ sused[i1] = 1; sprev[i1] = top; bfs.push(i1); } if(!sused[i2] && (sy[i2][i1]>0)){ sused[i2] = 1; sprev[i2] = top; bfs.push(i2); } } } //cout << 1 << endl; done: //cout << 1 << endl; if(zh == -1000) return 0; int flowVal = rm[zh]; int cur = -zh, prev; while(1){ //cout << 1 << endl; if(cur < 0){ prev = tprev[-cur]; } else{ prev = sprev[cur]; if(prev == TOU){ flowVal = mn(flowVal, zdWin[cur]); break; } else{ int Prev = -prev; int i1 = Prev/(n-1), i2 = Prev%(n-1); if(cur == i1) flowVal = mn(flowVal, sy[i1][i2]); else flowVal = mn(flowVal, sy[i2][i1]); } } cur = prev; } cur = -zh; rm[zh] -= flowVal; while(1){ //cout << 1 << endl; if(cur < 0){ prev = tprev[-cur]; } else{ prev = sprev[cur]; if(prev == TOU){ zdWin[cur] -= flowVal; break; } else{ int Prev = -prev; int i1 = Prev/(n-1), i2 = Prev%(n-1); if(cur == i1) sy[i1][i2] -= flowVal; else sy[i2][i1] -= flowVal; } } cur = prev; } return flowVal; } int main() { int t; scanf("%d", &t); for(int ii = 0; ii < t; ii++){ scanf("%d", &n); int sum = 0; for(int i = 0; i < n; i++){ scanf("%d%d", &win[i], &defeat[i]); } for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++){ scanf("%d", &rem[i][j]); if(i < j) sum += rem[i][j]; } } if(n == 1){ printf("1\n"); continue; } //sum为剩余的总场数 bool zhaodaole = 0; for(int i = 0; i < n; i++){ init(); int mxWin = win[i]; int zong = sum; for(int j = 0; j < n; j++) { mxWin += rem[i][j]; zong -= rem[i][j]; } //最后流的值必须等于zong,否则不行 //重新编號 int bh = 0; for(int j = 0; j < n; j++){ if(j == i) continue; pl[bh] = j; //npl[j] = bh; bh++; } //计算最多还能赢多少场 bool ky = 1; for(int j = 0; j < n-1; j++){ zdWin[j] = mxWin - win[pl[j]]; if(zdWin[j] < 0){ ky = 0; break; } } if(!ky) continue; for(int k = 0; k < n-2; k++){ for(int j = k+1; j < n-1; j++){ rm[getIdx(k, j)] = rem[pl[k]][pl[j]]; } } int flow = 0; int tmpFlow; while(1){ tmpFlow = pushFlow(); //cout << tmpFlow << endl; if(tmpFlow <= 0) break; flow += tmpFlow; } //cout << flow << " " << zong << endl; if(flow == zong) { if(zhaodaole) printf(" "); printf("%d", i+1); zhaodaole = 1; } } printf("\n"); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator