【题意分析】

  给你一张弦图,求图的最小染色数。

 

【解题思路】

  这篇讲稿已经讲得很详尽了。。

  直接求完美消除序列,然后倒着染色即可。复杂度O(n2+nm)。

【参考程序】

  求完美消除序列我是用的MCS(lexBFS都不会怎么办啊QAQ)。

  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('\n');
 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 }
View Code