| ||||||||||
| 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