题意:
K国是一个热衷三角形的国度,连人的交往也只喜欢三角原则.他们认为三角关系:即AB相互认识,BC相互认识,CA
相互认识,是简洁高效的.为了巩固三角关系,K国禁止四边关系,五边关系等等的存在.所谓N边关系,是指N个人 A1A2
…An之间仅存在N对认识关系:(A1A2)(A2A3)…(AnA1),而没有其它认识关系.比如四边关系指ABCD四个人 AB,BC,C
D,DA相互认识,而AC,BD不认识.全民比赛时,为了防止做弊,规定任意一对相互认识的人不得在一队,国王相知道,
最少可以分多少支队。
Input
第一行两个整数N,M。1<=N<=10000,1<=M<=1000000.表示有N个人,M对认识关系. 接下来M行每行输入一对朋
友
Output
输出一个整数,最少可以分多少队
Sample Input
4 5
1 2
1 4
2 4
2 3
3 4
Sample Output
3
解题方法: 弦图, 最大势算法。 具体见论文:《弦图与区间图》
#include <bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for(int i = a; i <= b; i++)
const int N = 1e6+10;
struct edge{
int v, nxt;
edge(){}
edge(int v, int nxt) : v(v), nxt(){}
}E[N*2];
int head[N], cnt, n, m;
void addedge(int u, int v){
E[cnt].v = v, E[cnt].nxt = head[u], head[u] = cnt++;
}
void init(){
memset(head, -1, sizeof(head));
cnt = 0;
}
bool vis[N];
int d[N], q[N], col[N], Hash[N];
int main(){
init();
scanf("%d%d", &n, &m);
rep(i, 1, m){
int u, v;
scanf("%d%d", &u, &v);
addedge(u, v);
addedge(v, u);
}
for(int i = n; i; i--){ //最大势算法
int t = 0;
for(int j = 1; j <= n; j++){
if(!vis[j] && d[j] >= d[t]){
t = j;
}
}
vis[t] = 1;
q[i] = t;
for(int j = head[t]; ~j; j = E[j].nxt){
d[E[j].v]++;
}
}
for(int i = n; i >= 1; i--){
cout << q[i] << " ";
}
cout << endl;
int ans = 0;
for(int i = n; i >= 1; i--){
int t = q[i];
for(int j = head[t]; ~j; j = E[j].nxt){
int v = E[j].v;
Hash[col[v]] = i;
}
int j;
for(j = 1; ; j++) if(Hash[j] != i) break;
col[t] = j;
if(j > ans) ans = j;
}
printf("%d\n", ans);
return 0;
}