您的位置:首页 > 其它

hdu2444 判断二分图+最大匹配

2013-07-20 09:55 218 查看
用黑白染色判断二分图。

#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
struct node
{
int u,v;
};
node edge[50000];
int first[300],next[50000];
int cc;
int vis[300];
int flag[300];
int linker[300];
inline void add_edge(int u,int v)
{
edge[cc].u=u;
edge[cc].v=v;
next[cc]=first[u];
first[u]=cc;
cc++;
}
int judge(int n)
{
queue<int> q;
int i;
for(i=1;i<=n;i++)        //有报告没有这句,我觉得是错的,因为如果图不连通的话 ,会有错误答案
{
if(vis[i]==-1)
{
q.push(i);
vis[i]=1;
while(!q.empty())
{
int u=q.front();
q.pop();
int j;
for(j=first[u];j!=-1;j=next[j])
{
int v=edge[j].v;
if(vis[v]==-1)
{
vis[v]=!vis[u];
q.push(v);
}
else if(vis[v]==vis[u])
return 0;
}
}
}
}
return 1;
}
bool dfs(int u)
{
int i;
for(i=first[u];i!=-1;i=next[i])
{
int v=edge[i].v;
if(!flag[v])
{
flag[v]=1;
if(linker[v]==-1||dfs(linker[v]))
{
linker[v]=u;
return true;
}
}
}
return false;
}
int match(int n)
{
int i;
int sum=0;
memset(linker,-1,sizeof(linker));
for(i=1;i<=n;i++)
{
if(vis[i]==1)
{
memset(flag,0,sizeof(flag));
if(dfs(i))
sum++;
}
}
return sum;
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
int i;
memset(vis,-1,sizeof(vis));
memset(first,-1,sizeof(first));
memset(next,-1,sizeof(next));
cc=0;
for(i=0;i<m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
add_edge(u,v);
add_edge(v,u);
}
int ans=judge(n);
if(ans==0)
printf("No\n");
else
{
int res=match(n);
printf("%d\n",res);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: