【题意分析】
给你一张弦图,求图的最小染色数。
【解题思路】
这篇讲稿已经讲得很详尽了。。
直接求完美消除序列,然后倒着染色即可。复杂度O(n2+nm)。
【参考程序】
求完美消除序列我是用的MCS(lexBFS都不会怎么办啊QAQ)。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <cctype> 2 #include <cstdio> 3 #define REP(I,start,end) for(int I=(start);I<=(end);I++) 4 #define PER(I,start,end) for(int I=(start);I>=(end);I--) 5 inline int space() 6 { 7 return putchar(' '); 8 } 9 inline int enter() 10 { 11 return putchar(' '); 12 } 13 inline int getint() 14 { 15 char ch=getchar(); 16 for(;!isdigit(ch)&&ch!='+'&&ch!='-';ch=getchar()); 17 bool impositive=ch=='-'; 18 if(impositive) 19 ch=getchar(); 20 int result=0; 21 for(;isdigit(ch);ch=getchar()) 22 result=(result<<3)+(result<<1)+ch-'0'; 23 return impositive?-result:result; 24 } 25 template<typename integer> inline int write(integer n) 26 { 27 integer now=n; 28 bool impositive=now<0; 29 if(impositive) 30 { 31 putchar('-'); 32 now=-now; 33 } 34 char sav[20]; 35 sav[0]=now%10+'0'; 36 int result=1; 37 for(;now/=10;sav[result++]=now%10+'0'); 38 PER(i,result-1,0) 39 putchar(sav[i]); 40 return result+impositive; 41 } 42 template<typename T> inline bool getmax(T &target,T pattern) 43 { 44 return pattern>target?target=pattern,true:false; 45 } 46 template<typename T> inline bool getmin(T &target,T pattern) 47 { 48 return pattern<target?target=pattern,true:false; 49 } 50 //=====================Header Template===================== 51 #pragma optimize(2) 52 #include <algorithm> 53 #include <cstring> 54 #include <vector> 55 using namespace std; 56 typedef vector<int> vecint; 57 typedef vecint::iterator vecnode; 58 bool used[10010]; 59 int q[10010],label[10010],color[10010]; 60 vecint edge[10010],rec[10010]; 61 int main() 62 { 63 int n=getint(); 64 memset(edge,0,sizeof(edge)); 65 for(int m=getint();m--;) 66 { 67 int u=getint(),v=getint(); 68 edge[u].push_back(v); 69 edge[v].push_back(u); 70 } 71 REP(i,1,n) 72 sort(edge[i].begin(),edge[i].end()); 73 memset(used,0,sizeof(used)); 74 memset(label,0,sizeof(label)); 75 memset(rec,0,sizeof(rec)); 76 int best=label[0]=0; 77 REP(i,1,n) 78 rec[0].push_back(i); 79 REP(i,1,n) 80 { 81 for(;;best-=rec[best].empty()) 82 { 83 for(;!rec[best].empty()&&used[rec[best].back()];rec[best].pop_back()); 84 if(!rec[best].empty()) 85 { 86 used[q[i]=rec[best].back()]=true; 87 break; 88 } 89 } 90 int now=q[i]; 91 for(vecnode it=edge[now].begin();it!=edge[now].end();it++) 92 { 93 int p=*it,pv=++label[p]; 94 rec[pv].push_back(p); 95 getmax(best,pv); 96 } 97 } 98 memset(color,0,sizeof(color)); 99 int ans=0; 100 REP(i,1,n) 101 { 102 int now=q[i]; 103 memset(used,0,sizeof(used)); 104 for(vecnode it=edge[now].begin();it!=edge[now].end();it++) 105 used[color[*it]]=true; 106 REP(j,1,n) 107 if(!used[j]) 108 { 109 color[now]=j; 110 getmax(ans,j); 111 break; 112 } 113 } 114 write(ans); 115 enter(); 116 return 0; 117 }