| ||||||||||
| 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 | |||||||||
样例都过了,为什么还没A?!!#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
#define INF 99999999
int n,p,f;
int flow[55][55];
int map[55][55];
int input[55][12];
int output[55][12];///1-n node ,0 source ,n destination
int perf[55];
int a[55];
int q[55];
int pre[55];
int min(int a,int b)
{ return a<b?a:b;}
bool bfs()
{
memset(a,0,sizeof(a));
memset(q,0,sizeof(q));
memset(pre,0,sizeof(pre));
int head,tail;
head=tail=0;
q[tail++]=0;
a[0]=INF;
while(head<tail)
{
int u=q[head++];
for(int v=0;v<=n+1;++v)
if(!a[v]&&map[u][v]>flow[u][v])
{
a[v]=min(a[u],map[u][v]-flow[u][v]);
pre[v]=u;
if(v==n+1)
return true;
q[tail++]=v;
}
}
return false;
}
void maxflow()
{
while(bfs())
{
for(int u=n+1;u!=0;u=pre[u])
{
flow[pre[u]][u]+=a[n+1];
flow[u][pre[u]]-=a[n+1];
}
f+=a[n+1];
}
}
int main ()
{
while(scanf("%d%d",&p,&n)!=EOF)
{
f=0;
memset(input,0,sizeof(input));
memset(output,0,sizeof(output));
memset(map,0,sizeof(map));
memset(flow,0,sizeof(flow));
// initialize
for(int i=1;i<=n;++i)
{
scanf("%d",&perf[i]);
for(int j=1;j<=p;++j) //jth part input
scanf("%d",&input[i][j]);
for(int j=1;j<=p;++j)
scanf("%d",&output[i][j]); // jth part output
}
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)/// jth output to ith
{
if(i==j) continue;
bool flag=true;
for(int k=1;k<=p;++k)
if(input[i][k]!=2&&input[i][k]!=output[j][k])
{flag=false;break;}
if(flag)//create edge
{
map[j][i]=min(perf[j],perf[i]);
}
}
for(int i=1;i<=n;++i)
{
bool flag=true;
for(int k=1;k<=p;++k)
if(input[i][k]==1)
flag=false;
if(flag) map[0][i]=perf[i]; //0 2 true
}
for(int i=1;i<=n;++i)
{
bool flag=true;
for(int k=1;k<=p;++k)
if(output[i][k]==0)
flag=false;
if(flag) map[i][n+1]=perf[i];
}
maxflow();
int num=0;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
if(flow[i][j]&&map[i][j])
num++;
printf("%d %d\n",f,num);
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
if(flow[i][j]&&map[i][j])
{
printf("%d %d %d\n",i,j,flow[i][j]);
}
}
system("pause");
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator