| ||||||||||
| 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 | |||||||||
用最大流增广路径写的二分图算法。。#include <iostream>
#include <queue>
using namespace std;
bool matL[510][510];
bool matR[510][510];
bool Rvisited[510];
bool Lvisited[510];
int N,K;
struct nod
{
int drect;//0:L,1:R
int seq;
};
nod L[510];
nod R[510];
int Lp[510];
int Rp[510];
int cnt;
void inpt()
{
int l,r;
int i;
scanf("%d%d",&N,&K);
for(i=1;i<=N;++i)
{
matR[i][N+1]=1;//N+1列保存R到终点的情况
}
while(K--)
{
scanf("%d%d",&l,&r);
matL[l][r]=1;
}
for(i=1;i<=N;++i)
{
L[i].drect=0;
R[i].drect=1;
L[i].seq=i;
R[i].seq=i;
}
}
void solve()
{
int i,j;
queue<nod> temp;
nod p;
int t;
int x;
int ex;
for(i=1;i<=N;++i)
{
memset(Rvisited,0,sizeof(Rvisited));
memset(Lvisited,0,sizeof(Lvisited));
while(!temp.empty())
temp.pop();
temp.push(L[i]);
ex=0;
while(!temp.empty()&&(!ex))
{
p=temp.front();
temp.pop();
if(p.drect==0)
{
for(j=1;j<=N;++j)
{
if(matL[p.seq][j]&&(!Rvisited[j]))
{
temp.push(R[j]);
Rp[j]=p.seq;
Rvisited[j]=1;
}
}
}
else
{
for(j=1;j<=N+1;++j)
{
if(matR[p.seq][j]&&(!Lvisited[j]))
{
if(j==N+1)
{
matR[p.seq][N+1]=0;
t=Rp[p.seq];
x=p.seq;
while(t!=i)
{
matL[t][x]=0;
matR[x][t]=1;
x=t;
t=Lp[x];
matR[t][x]=0;
matL[x][t]=1;
x=t;
t=Rp[x];
}
matL[t][x]=0;
matR[x][t]=1;
cnt++;
ex=1;
break;
}
else
{
temp.push(L[j]);
Lp[j]=p.seq;
Lvisited[j]=1;
}
}
}
}
}
}
}
void outp()
{
printf("%d\n",cnt);
}
int main()
{
inpt();
solve();
outp();
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator