uva1613 K-Graph Oddity
2024-09-20 20:27:17
题目要求k>=最大度数;
观察,颜色数量和度数的关系,得颜色数=最大度数+1(偶数)//最大度数(奇数) 可以满足染色关系
一个点和周围的点的颜色数加起来最大为它的度数+1;
k=所有点中最大的度。如果最大入度是偶数,则k+1。
证明:当最大度数为奇数n,设点u所连n个点,点u为1,n-1个点不一样,1个点和某个点相同(2-n),那么其他n-1个点可以相连,度数n-2+1=n-1,如果再连这个相同点,度数为n;然而此时一共有n+1个点,为偶数,所以要再加一个点
如果加到这个点(新的n),最大度数改变,不可以;加到其他点,也不能超过n,所以一定有两个点没有直接相连,交换没有直接相连的点和(新的n那个点),就满足了条件
策略:dfs
k = (max(deg+1,deg+1+n))|1;
#include <iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = ;
const int maxm = ; //为啥开这么大....用100005re int head[maxn],to[maxm],nxt[maxm],col[maxn],ecnt,deg[maxn];
int vis[maxn];
int k;
void addEdge(int u,int v)
{
deg[u]++;
k=max(k,deg[u]);
to[ecnt] = v;
nxt[ecnt] = head[u];
head[u] = ecnt++;
}
void dfs(int u)
{
for(int i = head[u]; i!=-; i= nxt[i])
vis[col[to[i]]] = u; //u的连接点的颜色都标记为u,不能用 for(int i = ; i <= k; i++)
if(vis[i] != u)
{
col[u] = i;
break;
} for(int i = head[u]; i!=-; i= nxt[i]){
if(col[to[i]]) continue;
dfs(to[i]);
}
} int main()
{
int n,m;
while(scanf("%d",&n)==){
k=;
scanf("%d",&m);
memset(head,-,sizeof(head));
memset(deg,,sizeof(deg));
memset(col,,sizeof(col));
ecnt = ; while(m--){
int u,v;
scanf("%d %d",&u,&v);
addEdge(u,v); addEdge(v,u);
} k = k|;
memset(vis,,sizeof(vis)); dfs();
printf("%d\n",k);
for(int i = ; i <= n; i++)
printf("%d\n",col[i]);
cout<<endl;
}
return ;
}
最新文章
- avascript中的this与函数讲解
- ECMAScript 位运算符
- AdaBoost
- NOI题库分治算法刷题记录
- 关于Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定文件编码类型
- c++工程vs导入工程时发生LNK1207
- JavaScript基于对象(面向对象)<;一>;类和对象
- map初始化定时器
- Python练习题 029:Project Euler 001:3和5的倍数
- C# 网络编程之豆瓣OAuth2.0认证具体解释和遇到的各种问题及解决
- MySql可视化工具MySQL Workbench使用教程
- 嵌入式Linux引导过程之1.2——Xloader的XLOADER_ENTRY
- Java代码风格和在idea中的一些设置
- 微信小程序域名配置问题
- mysql 按照月份自动创建表,以年和月为表明,动态生成。
- Java ThreadPool的正确打开方式花钱的年华 | 江南白衣(5星推荐)
- Android自定义布局的背景在多分辨率的情况下设置fill_parent时背景不能够横向全屏的问题解决
- C#的async和awaiit的一些记录
- Discuz x3.2七牛远程附件设置
- String、StringBuffer与StringBuilder区别