首页 > 代码库 > BZOJ 1006: [HNOI2008]神奇的国度(弦图染色)
BZOJ 1006: [HNOI2008]神奇的国度(弦图染色)
http://www.lydsy.com/JudgeOnline/problem.php?id=1006
题意:
思路:
这个就是弦图染色问题,弦图啥的反正我也不懂,具体看论文https://wenku.baidu.com/view/07f4be196c175f0e7cd13784.html
这里的话就是用最大势算法求了一个完美消除序列,然后根据完美消除序列来进行染色即可。
1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<sstream> 6 #include<vector> 7 #include<stack> 8 #include<queue> 9 #include<cmath>10 #include<map>11 #include<set>12 using namespace std;13 typedef long long ll;14 typedef pair<int,ll> pll;15 const int INF = 0x3f3f3f3f;16 const int maxn=10000+5;17 18 int n, m;19 int head[maxn];20 int tot;21 int ans;22 int label[maxn]; //label[i]表示第i个点与多少个已标号的点相邻,每次选择label[i]最大的未标号的点进行标号23 int vis[maxn];24 int q[maxn];25 int check[maxn];26 int col[maxn];27 28 struct node29 {30 int v;31 int next;32 }e[2*1000000+1000];33 34 void addEdge(int u, int v)35 {36 e[tot].v=v;37 e[tot].next=head[u];38 head[u]=tot++;39 }40 41 void MCS() //最大势算法求完美消除序列42 {43 memset(vis,0,sizeof(vis));44 for(int i=n;i;i--)45 {46 int pos=0;47 for(int j=1;j<=n;j++) //选择当前未访问且label值最大的48 if(!vis[j] && label[j]>=label[pos]) pos=j;49 vis[pos]=1;50 q[i]=pos;51 for(int j=head[pos];j!=-1;j=e[j].next) //与pos结点相邻的结点label值+152 label[e[j].v]++;53 }54 }55 56 void color()//染色57 {58 memset(check,0,sizeof(check));59 memset(col,0,sizeof(col));60 for(int i=n;i;i--)61 {62 int pos=q[i],j;63 for(int j=head[pos];j!=-1;j=e[j].next) check[col[e[j].v]]=i;64 for(j=1;;j++) if(check[j]!=i) break;65 col[pos]=j;66 if(j>ans) ans=j;67 }68 }69 70 int main()71 {72 //freopen("in.txt","r",stdin);73 while(~scanf("%d%d",&n,&m))74 {75 tot=0;76 memset(head,-1,sizeof(head));77 while(m--)78 {79 int u,v;80 scanf("%d%d",&u,&v);81 addEdge(u,v);82 addEdge(v,u);83 }84 ans=0;85 MCS();86 color();87 printf("%d\n",ans);88 }89 return 0;90 }
BZOJ 1006: [HNOI2008]神奇的国度(弦图染色)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。