BZOJ1006 HNOI2008 神奇的国度
2015-09-08 18:45
447 查看
1006: [HNOI2008]神奇的国度
Time Limit: 20 Sec Memory Limit:162 MB
Submit: 2463 Solved: 1110
[Submit][Status][Discuss]
Description
K国是一个热衷三角形的国度,连人的交往也只喜欢三角原则.他们认为三角关系:即AB相互认识,BC相互认识,CA相互认识,是简洁高效的.为了巩固三角关系,K国禁止四边关系,五边关系等等的存在.所谓N边关系,是指N个人 A1A2...An之间仅存在N对认识关系:(A1A2)(A2A3)...(AnA1),而没有其它认识关系.比如四边关系指ABCD四个人 AB,BC,CD,DA相互认识,而AC,BD不认识.全民比赛时,为了防止做弊,规定任意一对相互认识的人不得在一队,国王相知道,最少可以分多少支队。Input
第一行两个整数N,M。1<=N<=10000,1<=M<=1000000.表示有N个人,M对认识关系. 接下来M行每行输入一对朋友Output
输出一个整数,最少可以分多少队Sample Input
4 51 2
1 4
2 4
2 3
3 4
Sample Output
3这种松蘑幼儿园就做过的题也没啥好讲的,就是好久没更新blog了来水一水,题解详见CDQ《弦图与区间图》
代码如下:
/************************************************************** Problem: 1006 User: duyixian Language: C++ Result: Accepted Time:1064 ms Memory:29424 kb ****************************************************************/ /* * @Author: duyixian * @Date: 2015-09-08 16:02:39 * @Last Modified by: duyixian * @Last Modified time: 2015-09-08 16:46:27 */ #include "cstdio" #include "cstdlib" #include "iostream" #include "algorithm" #include "cstring" #include "queue" using namespace std; #define MAX_SIZE 10005 #define INF 0x3F3F3F3F #define Eps #define Mod inline int Get_Int() { int Num = 0, Flag = 1; char ch; do { ch = getchar(); if(ch == '-') Flag *= -1; } while(ch < '0' || ch > '9'); do { Num = Num * 10 + ch - '0'; ch = getchar(); } while(ch >= '0' && ch <= '9'); return Num *Flag; } struct Edge { int To, Next; }Edges[2000005]; int N, M, Total; int Front[MAX_SIZE], Sequence[MAX_SIZE], Label[MAX_SIZE], Order[MAX_SIZE], Mark[MAX_SIZE], Color[MAX_SIZE]; priority_queue< pair<int, int> > Heap; inline void Add_Edge(int From, int To) { Edges[++Total].To = To; Edges[Total].Next = Front[From]; Front[From] = Total; } inline void Add_Edges(int From, int To) { Add_Edge(From, To); Add_Edge(To, From); } inline void Find() { for(int i = 1; i <= N; ++i) Heap.push(make_pair(0, i)); for(int j = N; j >= 1; ) { int Now = Heap.top().second; Heap.pop(); if(Order[Now]) continue; Sequence[j] = Now; Order[Now] = j--; for(int i = Front[Now]; i; i = Edges[i].Next) { if(Order[Edges[i].To]) continue; ++Label[Edges[i].To]; Heap.push(make_pair(Label[Edges[i].To], Edges[i].To)); } } } inline void Coloring(int Now) { for(int i = Front[Now]; i; i = Edges[i].Next) { if(!Color[Edges[i].To]) continue; Mark[Color[Edges[i].To]] = Now; } for(int i = 1; i <= N; ++i) if(Mark[i] != Now) { Color[Now] = i; break; } } int main() { cin >> N >> M; for(int i = 1; i <= M; ++i) Add_Edges(Get_Int(), Get_Int()); Find(); for(int i = N; i >= 1; --i) Coloring(Sequence[i]); int Ans = 0; for(int i = 1; i <= N; ++i) Ans = max(Ans, Color[i]); cout << Ans << endl; return 0; }
相关文章推荐
- AbstractQueuedSynchronizer的实现分析(下)
- Android四大主件之广播BroadcastProvider
- leetcode1
- StartedService与BoundService 以及IntentService的简单使用
- 嵌入式程序员的面试经历
- silverlight调用bing地图 和 显示中文地图
- 0908
- 突然想到一个问题:有关 cqrs 分离
- Openwrt 修改Mac地址
- 得墨忒耳定律
- 最近公共祖先 模板 裸题
- Openwrt 修改Mac地址
- ios简单数据库运用
- (总结)Nginx使用的php-fpm的两种进程管理方式及优化
- java SE 基础复习-数组
- [LeetCode] Minimum Window Substring
- 解决ios9 中UITableView 的Cell 自动缩进问题
- Android的selector,Button按钮背景选择器
- AbstractQueuedSynchronizer的实现分析(上)
- MVC中使用SignalR打造酷炫实用的即时通讯功能附源码