题意: 给你n个点,m条边,找出使相连的点颜色都不一样的方案.
个人感想:这我个人感觉实在挺简单,一个DFS就可以了,但我以为会超时,但是并没有,我还wa了几次!!活该…主要是没看英文,很多人都会想到DFS,但是我们会发现为什么答案输出比点多一个!! 其中的第一个输出是输出K,K是什么鬼?
On the first line of the output file write a single integer number k — the minimal odd integer
number, such that the degree of any vertex does not exceed k.
分析:首先,先建立好原图,从任意一个点进入,进行DFS,遍历当前点的所有子节点.看他们染了什么颜色,然后找到染了颜色的最小值,就是当前点该染得颜色,至于输出的K值呢,统计一下出入度就好了,建立一条边,找最大的出度值,就是K的值了.
代码:
/* Author:GavinjouElephant
* Title:
* Number:
* main meanning:
*
*
*
*/
//#define OUT
#include <iostream>
using namespace std;
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <sstream>
#include <cctype>
#include <vector>
#include <set>
#include <cstdlib>
#include <map>
#include <queue>
//#include<initializer_list>
//#include <windows.h>
//#include <fstream>
//#include <conio.h>
#define MaxN 0x7fffffff
#define MinN -0x7fffffff
#define Clear(x) memset(x,0,sizeof(x))
const int INF=0x3f3f3f3f;
int P,N;
int K;
const int maxn=200005;
int cp[maxn];
int degree[maxn];
bool flag[2*maxn];
vector<int> p[maxn];
void init()
{
K=0;
memset(degree,0,sizeof(degree));
for(int i=1;i<=P;i++)
{
cp[i]=-1;
p[i].clear();
}
}
void add_adge(int from,int to)
{
p[from].push_back(to);
p[to].push_back(from);
}
void dfs(int id)
{
memset(flag,false,sizeof(flag));
int Size=p[id].size();
for(int j=0;j<Size;j++)
{
int v=p[id][j];
if(cp[v]!=-1)
{
flag[cp[v]]=true;
}
}
int inde=1;
while(true)
{
if(!flag[inde])break;
inde++;
}
cp[id]=inde;
for(int j=0;j<Size;j++)
{
int v=p[id][j];
if(cp[v]==-1)
{
dfs(v);
}
}
}
int main()
{
#ifdef OUT
freopen("coco.txt","r",stdin);
freopen("lala.txt","w",stdout);
#endif
while(scanf("%d%d",&P,&N)!=EOF)
{
init();
int x,y;
for(int i=0;i<N;i++)
{
scanf("%d%d",&x,&y);
if(x==y)continue;
add_adge(x,y);
degree[x]++;
degree[y]++;
int t=max(degree[x],degree[y]);
K=max(K,t);
}
if(K%2==0)K++;
for(int i=1;i<=P;i++)
{
if(cp[i]==-1)
{
dfs(i);
}
}
printf("%d\n",K);
for(int j=1;j<=P;j++)
{
printf("%d\n",cp[j]);
}
printf("\n");
}
return 0;
}