牛客网 wannafly27 紫魔法师 /*判断二分图*/
链接:https://ac.nowcoder.com/acm/contest/215/B
来源:牛客网
紫魔法师
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld题目描述
“サーヴァント、キャスター、Medea。”--紫魔法师
给出一棵仙人掌(每条边最多被包含于一个环,无自环,无重边,保证连通),要求用最少的颜色对其顶点染色,满足每条边两个端点的颜色不同,输出最小颜色数即可
输入描述:
第一行包括两个整数n,m,表示顶点数和边数 n <= 100000, m <= 200000 接下来m行每行两个整数u,v,表示u,v之间有一条无向边,保证数据合法
输出描述:
一行一个整数表示最小颜色数
示例1
输入
复制
3 4 1 2 2 3 3 4 1 4
输出
复制
2
古董题目,一直没静下心来补。
染色问题,1个点一种颜色,二分图2种颜色,否则3种颜色。
(暴力染就行了)
/*
Date: 10/02/19 00:12
Description:
*/
#include <iostream>
#include <vector>
#include <cstdio>
using namespace std;
#define MAXN 100005
int n,m;
vector <int > mp[MAXN];
int colour[MAXN];
int k=1;
void dfs(int v,int c){
for(int i=0;i<(int)mp[v].size();i++){
if(colour[mp[v][i]]==c) {
k=0;
return;
}
if(colour[mp[v][i]]==-c) continue;
colour[mp[v][i]]=-c;
dfs(mp[v][i],-c);
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
mp[u].push_back(v);
mp[v].push_back(u);
}
colour[1]=1;
dfs(1,1);
if(n==1) {
puts("1");
}
else if(k){
puts("2");
}
else {
puts("3");
}
return 0;
}
标程里,说可以判断是否有奇数环,有的话就不是二分图。(那么就是并查集实现了)
并查集找到环的时候,直接dfs搜,也能过。