题目:https://www.luogu.org/problemnew/show/P1330

此题我最初没有思路,暴搜而爆0;

然后才明白关键在于把所有点分成两类,因为可以发现点之间的关系是存在两两对立的;

这样一张图的情况就是固定的,确定一个点就能够确定其他所有点,因为一条边的两个点必然属于不同的类别,可以通过遍历边来进行深搜染色;

最后取各连通块中较少的那一类点,相加即为结果;

而若在染色中出现矛盾,则一定为“Impossible”。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
int n,m,a,b,cnt[10005],ct,col[10005],s[5],ans;
struct N{
int to;int next;
}edge[200005];//!
void add(int x,int y)
{
ct++;
edge[ct].to=y;
edge[ct].next=cnt[x];
cnt[x]=ct;
}
void dfs(int x)
{
for(int i=cnt[x];i;i=edge[i].next)
{
int v=edge[i].to;
if(col[v]==col[x])
{
printf("Impossible");
exit(0);
}
if(!col[v])
{
col[v]=3-col[x];
s[col[v]]++;
dfs(v);
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
add(a,b);add(b,a);
}
for(int i=1;i<=ct;i++)
{
int v=edge[i].to;
s[1]=0;s[2]=0;
if(!col[v])
{
col[v]=1;
s[col[v]]++;
dfs(v);
ans+=min(s[1],s[2]);
}
}
printf("%d",ans);
return 0;
}

  

最新文章

  1. [资料分享]7天搞定Node.js微信公众号开发
  2. MS SQL 两种分页
  3. 安装完eos出的问题
  4. 360浏览器下jquery.validate.unobtrusive的日期验证问题
  5. .net 中读取自定义Config文件
  6. startsWith
  7. 转NodeJS的npm模块版本号 模式解析
  8. [TypeScript] Configuring TypeScript Which Files to Compile with &quot;Files&quot; and &quot;OutDir&quot;
  9. 一个CS出身的基本素养
  10. post跨域请求
  11. nmp install 异常
  12. java基础(10) -线程
  13. OpenCV 之 图像分割 (一)
  14. 03 SeekBar 音频播放拖拽进度条
  15. Thunar 通过快捷键在当前文件夹打开终端
  16. 行为驱动:Cucumber + Selenium + Java(三) - 使用标签实现测试分组
  17. VS2013安装Boost
  18. JavaScript数组对象常用方法
  19. BZOJ1208[HNOI2004]宠物收养场——treap
  20. Java IO--BIO

热门文章

  1. jsp获取web.xml 里的配置项
  2. Chapter 4 马尔科夫链
  3. 集群 安装 配置FastDFS
  4. C#与Java在修饰符上的不同
  5. css选择器参考手册
  6. JavaMelody tomcat应用监控
  7. Python 爬虫常见的坑和解决方法
  8. Eclipse中执行Tomcat源代码
  9. iOS 应用发布
  10. Wix Burn运行64位dism.exe的问题