PIPIOJ1414: 二步侠PIPI(二分图染色)

题目描述

已知有n个城市,城市之间有m条道路。PIPI准备从1号城市出发,游览剩下所有的城市。但是PIPI有个强迫症,他的行动是二步流的。什么是二步流呢?比如:1号城市和2号城市之间有条道路,2号城市和3号城市之间有条道路,PIPI的路线为1->2->3或者1->2->1。但他只是经过了2号城市到达了3号或1号城市进行游览,而2号城市永远只能经过而无法游览到。
为了满足自己的强迫症,同时又游览所有城市,财大气粗的PIPI可以在任意城市之间修建道路。
出于节约成本低碳环保考虑,PIPI最少修建多少条道路即可游览所有城市?

输入

第一行两个整数n,m,其中:3<=n<=105,0<=m<=105。
接下来m行,每行两个正整数u,v(u,v<=n),表示u号城市与v号城市之间有一条道路。
PS:数据保证无自环,不保证不会出现重边。

输出

输出PIPI最少需要修建的道路条数。

样例输入
5 4
1 2
2 3
3 4
4 5
样例输出
1
解题思路

这是一个二分图奇偶染色问题,存在如下几种情况:

  • (1) 图中只有1个联通块,如果存在奇环则不需要连边,否则连1条边
  • (2) 图中存在多个联通块,起点所在联通块存在奇环,则说明起点所在连通块所有点均可到达,对于其它每个联通块连一条边即可
  • (3) 图中存在多个联通块,起点所在联通块不存在奇环,如果其它联通块存在奇环或偶环,则把其它每个联通块连一条边(子联通块存在奇环/偶环通过合理连边可以实现整个联通块存在奇环)
  • (4) 图中所有联通块中不存在环,所有子联通块连一条边,同时再连一条边让整个联通块存在奇环

code

#include 
using namespace std;
typedef long long ll;
static const int maxn=1e5+5;
int n,m;
vectore[maxn];
int col[maxn];
bool vis[maxn];
bool ok1,ok2;
void dfs(int u,int fa){
    for(int i=0;i

你可能感兴趣的:(PIPIOJ1414: 二步侠PIPI(二分图染色))