CF624C - Graph and String

来源:互联网 发布:flash mac中文版 编辑:程序博客网 时间:2024/06/14 19:28

题目大意:有一个由abc构成的字符串,aa,bb,cc,ab,ac之间连双向边,构成一个图,现在把这个图给出来,问是否存在这样的字符串,如果有,构造一个。

很容易发现一个性质,b可以往所有点连边,没边的只有ac之间,所以可以先把b扫出来,然后剩下的点再染成ac,大概类似于一个二分图染色,有冲突就非法,没冲突最后输出。

<我代码写得很挫勿借鉴>

#include<cstdio>#include<iostream>#include<cstring>#include<string>#include<algorithm>#include<cmath>using namespace std;int e[550][550];int col[550];int n,m;int vv;void RAN(int x,int q){//printf("x=%d\n",x);if(vv)return;col[x]=q;for(int i=1;i<=n;i++){if(i!=x&&e[x][i]==0){if(col[i]){if(col[i]==q){vv=1;return;}}else{RAN(i,q==1?2:1);}}}}int main(){scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);e[x][y]=1;e[y][x]=1;}int w=0;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(i!=j&&e[i][j]==0){if(!col[i])RAN(i,1);w=1;break;}}if(w)break;}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(col[i]!=col[j]&&col[i]&&col[j]){if(e[i][j])vv=1;}if(i!=j&&e[i][j]==0){if(col[i]==0||col[j]==0)vv=1;}}}if(vv){printf("No\n");}else{printf("Yes\n");for(int i=1;i<=n;i++){if(col[i]==1)printf("a");if(col[i]==2)printf("c");if(!col[i])printf("b");}printf("\n");}return 0;}


0 0
原创粉丝点击