| ||||||||||
| 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<cstdlib>
#include<vector>
using namespace std;
const int INF=100;
#define min(a,b) a<b?a:b
#define max(a,b) a>b?a:b
vector<int> v1[51],v2[51];
bool DFS(int p,int n,int *match,bool map[][51],bool *xckd,bool *yckd);
void KM(int n,int edge[][51],int *match,bool map[][51],bool *xckd,bool *yckd)
{
int i,j;
int lx[51],ly[51];
for(i=1;i<=n;i++)
{
lx[i]=-INF;
ly[i]=0;
for(j=1;j<=n;j++)
{
lx[i]=max(lx[i],edge[i][j]);
}
}
bool perfect=false;
while(!perfect)
{
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(lx[i]+ly[j]==edge[i][j]) map[i][j]=true;
else map[i][j]=false;
}
}
int live=0;
for(i=0;i<=n;i++) match[i]=-1;
for(i=1;i<=n;i++)
{
memset(xckd,false,sizeof(xckd));
memset(yckd,false,sizeof(yckd));
if(DFS(i,n,match,map,xckd,yckd)) live++;
else
{
xckd[i]=true;
break;
}
}
if(live==n) perfect=true;
else
{
int ex=INF;
for(i=1;i<=n;i++)
{
for(j=1;xckd[i]&&j<=n;j++)
{
if(!yckd[j]) ex=min(ex,lx[i]+ly[j]-edge[i][j]);
}
}
for(i=1;i<=n;i++)
{
if(xckd[i]) lx[i]-=ex;
if(yckd[i]) ly[i]+=ex;
}
}
}
}
bool DFS(int p,int n,int *match,bool map[][51],bool *xckd,bool *yckd)
{
int i;
for(i=1;i<=n;i++)
{
if(!yckd[i]&&map[p][i])
{
yckd[i]=true;
int t=match[i];
match[i]=p;
if(t==-1||DFS(t,n,match,map,xckd,yckd))
{
return true;
}
match[i]=t;
if(t!=-1) xckd[t]=true;
}
}
return false;
}
int search(int x,int y)
{
// if(v1[x].size()==0||v2[y].size()==0) return 1;
int edge[51][51];
bool map[51][51];
bool xckd[51], yckd[51];
int match[51];
int n,m,i,k;
int count,x1,y1;
n=v1[x].size();
m=v2[y].size();
if(n==0||m==0) return 1;
memset(edge,0,sizeof(edge));
for(i=0;i<n;i++)
{
x1=v1[x][i];
for(k=0;k<m;k++)
{
y1=v2[y][k];
edge[i+1][k+1]=search(x1,y1);
}
}
KM(n,edge,match,map,xckd,yckd);
count=0;
for(i=1;i<=n;i++)
{
count+=edge[match[i]][i];
}
return count+1;
}
int main()
{
int n,m,a,b,i;
while((scanf("%d %d",&n,&m))!=-1)
{
for(i=1;i<=n-1;i++)
{
scanf("%d %d",&a,&b);
v1[b].push_back(a);
}
for(i=1;i<=m-1;i++)
{
scanf("%d %d",&a,&b);
v2[b].push_back(a);
}
printf("%d\n",search(1,1));
for(i=1;i<=n;i++) v1[i].clear();
for(i=1;i<=m;i++) v2[i].clear();
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator