#include<stdio.h>
#include<iostream>
using namespace std;
int num_edge=0,head[10001],sum,n,m,u,v,d,mark[10001],sum1=1,sum2=0;
bool markt=0;
struct Edge
{
int next,to,dis;
}edge[200001];
void add_edge(int from,int to)
{
edge[++num_edge].next=head[from];
edge[num_edge].to=to;
head[from]=num_edge;
}
void dfs(int tt,int mi)
{
for(int i=head[tt];i!=0;i=edge[i].next)
{ if(markt==1) return;
if(mark[edge[i].to]==0)
{
mark[edge[i].to]=mi;
if(mi==1) {//printf("%d %d>>
",mark[edge[i].to],edge[i].to);
sum1++;
}
else
{//printf("%d %d<<
",mark[edge[i].to],edge[i].to);
sum2++;
}
dfs(edge[i].to,-mark[edge[i].to]);
}
else if(mark[edge[i].to]!=mi)
{
printf("Impossible");markt=1;return;
}
}
}
int min(int a,int b)
{
return a>b?b:a;
}
int main()
{ cin>>n>>m;
for(int i=1;i<=m;i++)
{
cin>>u>>v;
add_edge(u,v);
add_edge(v,u);
}
for(int i=1;i<=n;i++)
{ if(mark[i]==0)
{mark[i]=1;
dfs(i,-mark[i]);
}
sum+=min(sum1,sum2);
sum1=1;sum2=0;
if(markt==1) return 0;
}
//for(int i=1;i<=n;i++)
// printf("%d>>%d ",i,mark[i]);
if(markt==0) printf("%d",sum);
return 0;
}
一个比较基础的图的遍历的模板题,深度优先搜索遍历。
黑白染色法,解决相邻点不同。
***注意:无向图储存边的条数是题目要求的两倍。。