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 N次了。#include <vector> #include <list> #include <map> #include <set> #include <deque> #include <queue> #include <stack> #include <bitset> #include <algorithm> #include <functional> #include <numeric> #include <utility> #include <sstream> #include <iostream> #include <iomanip> #include <cstdio> #include <cmath> #include <cstdlib> #include <ctime> using namespace std; #define max(a,b) ((a)>(b)?(a):(b)) #define min(a,b) ((a)<(b)?(a):(b)) #define sqr(a) ((a)*(a)) #define rep(i,a,b) for(i=(a);i<(b);i++) #define REP(i,n) rep(i,0,n) #define inf 1000000000 #define eps 1e-12 #define MAXV 110 int g[MAXV][MAXV]; int gg[MAXV][MAXV]; int start,end; int n,np; int path[MAXV]; struct node{ int p; int input[15]; int output[15]; }; node data[MAXV]; bool bfs() { int i; queue<int> q; memset(path,-1,sizeof path); q.push(start); while(!q.empty()) { int cur=q.front(); q.pop(); if(cur==end) break; rep(i,1,2*n+2) { if(g[cur][i]>0&&path[i]==-1) { path[i]=cur; q.push(i); } } } if(path[end]==-1) return false; return true; } int edmonds_karp() { int max_flow=0; while(bfs()) { int next=end,pre=path[end],min=inf; while(next!=start) { min=min(min,g[pre][next]); next=pre; pre=path[next]; } max_flow+=min; next=end,pre=path[end]; while(next!=start) { g[pre][next]-=min; g[next][pre]+=min; gg[pre][next]+=min; next=pre; pre=path[next]; } } return max_flow; } void make_graph() { int i, j, k, fail; for (i = 1; i <= n; i++) { g[i][i + n] = data[i].p; for (j = 1; j <= n; j++) { if (i == j) continue; fail = 0; for (k = 0; k < np; k++) { if (data[i].output[k] == data[j].input[k] || data[j].input[k] == 2) continue; fail = 1; break; } if (!fail) g[i + n][j] = data[j].p; } } start = 0; for (i = 1; i <= n; i++) { fail = 0; for (k = 0; k < np; k++) if (data[i].input[k] == 1) { fail = 1; break; } if (!fail) g[start][i] = data[i].p; } end = 2 * n + 1; for (i = 1; i <= n; i++) { fail = 0; for (k = 0; k < np; k++) if (!data[i].output[k]) { fail = 1; break; } if (!fail) g[i + n][end] = data[i].p; } } int main() { int i,j,res,num; int temp[5000][3]; scanf("%d%d",&np,&n); memset(g,0,sizeof g); memset(gg,0,sizeof gg); memset(data,0,sizeof data); num=0; REP(i,n) { scanf("%d",&data[i+1].p); REP(j,np) scanf("%d",&data[i+1].input[j]); REP(j,np) scanf("%d",&data[i+1].output[j]); } make_graph(); res=edmonds_karp(); num=0; rep(i,1,n+1) rep(j,1,n+1) if(i!=j&&gg[i+n][j]>0) {temp[num][0]=i;temp[num][1]=j;temp[num++][2]=gg[i+n][j];} printf("%d %d\n",res,num); REP(i,num) printf("%d %d %d\n",temp[i][0],temp[i][1],temp[i][2]); return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator