| ||||||||||
| 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#include <iostream>
#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;
#define INF 0x7f7f7f7f
#define T 2*N+1
#define min(a,b) ((a)<(b))?(a):(b)
struct Machine{
int Q,input[11],output[11];
}machine[55];
int P,N;
int map[150][150];
bool visit[150];
int layer[150];
int sta[150];
int ans,size,num;
struct Conection
{
int x,y;
int dd;
}conection[30000];
int coun;
void input()
{
int i,j;
for(i=1;i<=N;i++)
{
cin>>machine[i].Q;
for(j=0;j<P;j++)
cin>>machine[i].input[j];
for(j=0;j<P;j++)
cin>>machine[i].output[j];
map[i][i+N]+=machine[i].Q;
}
}
bool judge(int in[10],int out[10])
{
int i;
for(i=0;i<P;i++)
{
if(in[i]==out[i]||in[i]==2||out[i]==2)
continue;
return false;
}
return true;
}
void build()
{
int i,j;
for(i=1;i<=N;i++)
{
for(j=i+1;j<=N;j++)
{
if(judge(machine[i].input,machine[j].output))
map[j+N][i]=INF;
if(judge(machine[i].output,machine[j].input))
map[i+N][j]=INF;
}
bool flag1=true;
bool flag2=true;
for(j=0;j<P;j++)
{
if(machine[i].input[j]==1)
{
flag1=false;
}
if(machine[i].output[j]!=1)
{
flag2=false;
}
}
if(flag1)map[0][i]=INF;
if(flag2)map[i+N][T]=INF;
}
}
void out()
{
int i;
for(i=0;i<=coun;i++)
{
cout<<conection[i].x<<" "<<conection[i].y<<" "<<conection[i].dd<<endl;
}
}
bool dfs(int s,int t)
{
//cout<<"eee"<<endl;
bool temp;
sta[size]=s;
if(s==t)
{
int d=INF;
for(int i=0;i<size;i++)
{
if(map[sta[i]][sta[i+1]]<d)
{
d=map[sta[i]][sta[i+1]];
num=sta[i];
}
}
ans+=d;
for(int i=0;i<size;i++)
{
map[sta[i]][sta[i+1]]-=d;
map[sta[i+1]][sta[i]]+=d;
if(0<sta[i]&&sta[i]<T&&sta[i+1]>0&&sta[i+1]<T)
{
if((sta[i]%N)!=(sta[i+1]%N))
{
++coun;
if(sta[i]%N==0)
{
conection[coun].x=N;
conection[coun].y=sta[i+1]%N;
}
if(sta[i+1]%N==0)
{
conection[coun].x=sta[i]%N;
conection[coun].y=N;
}
else
{
conection[coun].x=sta[i]%N;
conection[coun].y=sta[i+1]%N;
}
conection[coun].dd=d;
}
}
}
return 1;
}
for(int i=0;i<=T;i++)
{
if(layer[i]==layer[s]+1&&map[s][i]>0)
{
size++;
temp=dfs(i,t);
size--;
if(temp&&num!=s)return 1;
}
}
return 0;
}
bool bfs(int s,int t)
{
int p;
queue<int>Q;
memset(visit,false,sizeof(visit));
memset(layer,-1,sizeof(layer));
layer[s]=0;
Q.push(s);
visit[s]=true;
while(!Q.empty())
{
p=Q.front();
Q.pop();
for(int i=1;i<=T;i++)
{
if(map[p][i]>0&&!visit[i])
{
layer[i]=layer[p]+1;
visit[i]=true;
if(i==t)return true;
Q.push(i);
}
}
}
return false;
}
int Dinic(int s,int t)
{
int Maxflow=0;
while(bfs(s,t))
{
size=0;ans=0;
dfs(s,t);
Maxflow+=ans;
}
return Maxflow;
}
int main()
{
//freopen("in.txt","r",stdin);
while(cin>>P>>N)
{
memset(map,0,sizeof(map));
input();
build();
coun=-1;
cout<<Dinic(0,T)<<" ";
cout<<coun+1<<endl;
out();
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator