| ||||||||||
| 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的教训……构图时节点编号从0开始狂wa了好多次,改成编号从1就ac了。费解中……
求开导!
代码:注释掉的代码是编号从0开始的代码。
#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int MN=110;
const int MV=10000*1000;
int c[MN][MN],f[MN][MN],S,T,mf,N,pre[MN],prev[MN],Q[MN*MN];
bool g[MN];
int n,n1,n2,m;
int abs(int x){if(x<0) return -x;return x;}
bool bfs()
{
int x,y,ss,tt;
pre[S]=S;
prev[S]=MV;
memset(g,false,sizeof(g));
g[S]=true;
ss=0;
tt=1;
Q[ss]=S;
while(ss<tt){
x=Q[ss++];
for(y=1;y<=N;y++){
//for(y=0;y<N;y++){
if(!g[y] && f[x][y]<c[x][y]){
g[y]=!g[y];
Q[tt++]=y;
pre[y]=x;
prev[y]=min(prev[x],c[x][y]-f[x][y]);
if(y==T)
return true;
}
if(!g[y] && f[y][x]>0){
g[y]=!g[y];
Q[tt++]=y;
pre[y]=-x;
prev[y]=min(prev[x],f[y][x]);
if(y==T)
return true;
}
}
}
return false;
}
void update()
{
int x,y;
x=T;
while(x!=S){
y=x;
x=abs(pre[y]);
if(pre[y]>0)
f[x][y]+=prev[T];
if(pre[y]<0)
f[y][x]-=prev[T];
}
}
void maxflow()
{
while(bfs())
update();
}
void read()
{
memset(c,0,sizeof(c));
memset(f,0,sizeof(f));
S=n+1;
T=n+2;
N=n+2;
/*
S=n;
T=n+1;
N=n+2;
*/
int x,y,r;
char ch;
while(m--){
scanf(" (%d,%d)%d",&x,&y,&r);
if(x==y) continue;
c[x+1][y+1]+=r;
//c[x][y]+=r;
}
while(n1--){
scanf(" (%d)%d",&x,&r);
c[S][x+1]=r;
//c[S][x]=r;
}
while(n2--){
scanf(" (%d)%d",&x,&r);
c[x+1][T]=r;
//c[x][T]=r;
}
}
void output()
{
mf=0;
for(int i=1;i<=N;i++)
//for(int i=0;i<N;i++)
mf+=f[S][i];
printf("%d\n",mf);
}
int main()
{
while(scanf("%d%d%d%d",&n,&n1,&n2,&m)!=EOF){
read();
maxflow();
output();
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator