bzoj1006题解
2024-09-02 23:16:12
【题意分析】
给你一张弦图,求图的最小染色数。
【解题思路】
这篇讲稿已经讲得很详尽了。。
直接求完美消除序列,然后倒着染色即可。复杂度O(n2+nm)。
【参考程序】
求完美消除序列我是用的MCS(lexBFS都不会怎么办啊QAQ)。
#include <cctype>
#include <cstdio>
#define REP(I,start,end) for(int I=(start);I<=(end);I++)
#define PER(I,start,end) for(int I=(start);I>=(end);I--)
inline int space()
{
return putchar(' ');
}
inline int enter()
{
return putchar('\n');
}
inline int getint()
{
char ch=getchar();
for(;!isdigit(ch)&&ch!='+'&&ch!='-';ch=getchar());
bool impositive=ch=='-';
if(impositive)
ch=getchar();
int result=;
for(;isdigit(ch);ch=getchar())
result=(result<<)+(result<<)+ch-'';
return impositive?-result:result;
}
template<typename integer> inline int write(integer n)
{
integer now=n;
bool impositive=now<;
if(impositive)
{
putchar('-');
now=-now;
}
char sav[];
sav[]=now%+'';
int result=;
for(;now/=;sav[result++]=now%+'');
PER(i,result-,)
putchar(sav[i]);
return result+impositive;
}
template<typename T> inline bool getmax(T &target,T pattern)
{
return pattern>target?target=pattern,true:false;
}
template<typename T> inline bool getmin(T &target,T pattern)
{
return pattern<target?target=pattern,true:false;
}
//=====================Header Template=====================
#pragma optimize(2)
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
typedef vector<int> vecint;
typedef vecint::iterator vecnode;
bool used[];
int q[],label[],color[];
vecint edge[],rec[];
int main()
{
int n=getint();
memset(edge,,sizeof(edge));
for(int m=getint();m--;)
{
int u=getint(),v=getint();
edge[u].push_back(v);
edge[v].push_back(u);
}
REP(i,,n)
sort(edge[i].begin(),edge[i].end());
memset(used,,sizeof(used));
memset(label,,sizeof(label));
memset(rec,,sizeof(rec));
int best=label[]=;
REP(i,,n)
rec[].push_back(i);
REP(i,,n)
{
for(;;best-=rec[best].empty())
{
for(;!rec[best].empty()&&used[rec[best].back()];rec[best].pop_back());
if(!rec[best].empty())
{
used[q[i]=rec[best].back()]=true;
break;
}
}
int now=q[i];
for(vecnode it=edge[now].begin();it!=edge[now].end();it++)
{
int p=*it,pv=++label[p];
rec[pv].push_back(p);
getmax(best,pv);
}
}
memset(color,,sizeof(color));
int ans=;
REP(i,,n)
{
int now=q[i];
memset(used,,sizeof(used));
for(vecnode it=edge[now].begin();it!=edge[now].end();it++)
used[color[*it]]=true;
REP(j,,n)
if(!used[j])
{
color[now]=j;
getmax(ans,j);
break;
}
}
write(ans);
enter();
return ;
}
最新文章
- C语言操作文件
- log4net日志功能使用
- 用PHP生成随机数的函数(代码示例)
- iOS UIView 基本属性用法
- 《深入理解linux内核》第一章 序论
- linux动态库加载RPATH, RUNPATH
- (转)iOS项目的目录结构和开发流程
- jQuery获取checkbox选中项等操作及注意事项
- [转]new一个Object对象占用多少内存?
- html select 标签设置默认选中
- 关于:未能加载文件或程序集“ICSharpCode.SharpZipLib”或它的某一个依赖项异常的解决方案
- Excel自动换行、Export2Excel 自动换行
- Redis和memcached缓存技术
- sql server 安装时提示要重启
- 【转】修复关于apache-xampp的问题:Port 443 in use by “vmware-hostd.exe”!
- Java时间类(转)
- C# 获取所有对象的字符串表示一ToString方法
- [python] 基于词云的关键词提取:wordcloud的使用、源码分析、中文词云生成和代码重写
- ABP实战--分页排序
- springboot的相关信息