#include<bits/stdc++.h>
using namespace std;
int t;
int link[100010];//记录前驱结点
bool vis[100010];
int n,m;
int color[100010];
vector<int>v[100101];
bool dfs(int x)
{
int i,j;
for(i=0;i<v[x].size();i++)
{
if(vis[v[x][i]]==0)
{
vis[v[x][i]]=1;
if(link[v[x][i]]==-1||dfs(link[v[x][i]]))//如果没有被访问,说明找到新的交错轨,进行增广。否则,继续找他的前驱是否有其他增广轨。
{
link[v[x][i]]=x;
return true;
}
}
}
return false;
}
void multi_path()
{
memset(link,-1,sizeof(link));
int i,j;
int ans=0;
for(i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
if(dfs(i))
ans++;
}
cout<<(ans/2)<<endl;
}
bool judge()
{
int i,j;
memset(color,-1,sizeof(color));
for(i=1;i<=n;i++)
{
if(color[i]==-1)//最开始染一种颜色
{
color[i]=0;
}
for(j=0;j<v[i].size();j++)
{
if(color[v[i][j]]==-1)//判断是否染色,-1表示没有染色,没有就燃一个相反地颜色
{
color[v[i][j]]=1-color[i];//染成相反地颜色
}
else if(color[v[i][j]]==color[i])//如果找到两个颜色相同,说明不是二分图,返回
{
return 1;
}
}
}
return 0;
}
int main()
{
std::ios::sync_with_stdio(false);
while(cin>>n>>m)
{
int i,j;
for(i=1;i<=n;i++)
v[i].clear();
int x,y;
for(i=0;i<m;i++)
{
cin>>x>>y;
v[x].push_back(y);
v[y].push_back(x);
}
if(judge())
{
cout<<"No"<<endl;
continue;
}
multi_path();
}
}
hdu 2444The Accomodation of Students 二分图判定+找最大匹配
最新推荐文章于 2020-05-13 13:49:21 发布