时间限制: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
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
int n,m,color[maxn],k=1;
vector<int>mp[maxn];
void dfs(int v,int c)
{
for(int i=0;i<mp[v].size();i++)
{
if(color[mp[v][i]]==c)
{
k=0;
return;
}
if(color[mp[v][i]]==-c) continue;
color[mp[v][i]]=-c;
dfs(mp[v][i],-c);
}
}
int main()
{
scanf("%d%d",&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);
}
color[1]=1;
dfs(1,1);
if(n==1)
printf("1\n");
else if(k==1)
printf("2\n");
else printf("3\n");//存在奇数环
}