poj1270 拓扑序(DFS)
2015-09-10 13:57
417 查看
题意:给出将会出现的多个字母,并紧接着给出一部分字母的大小关系,要求按照字典序从小到大输出所有符合上述关系的排列。
拓扑序,由于需要输出所有排列,所以需要使用 dfs ,只要点从小到大遍历就可以实现字典序排列了。
View Code
拓扑序,由于需要输出所有排列,所以需要使用 dfs ,只要点从小到大遍历就可以实现字典序排列了。
#include<stdio.h> #include<string.h> int ma[26][26],id[26],vis[26],v[26],n; char s[10],ans[50]; char read(){ char c=getchar(); while((c>'z'||c<'a')&&(c!='\n'))c=getchar(); return c; } void dfs(int ss,int t){ ans[t]=ss+'a'; v[ss]=1; if(t==n){ for(int i=1;i<=n;++i)printf("%c",ans[i]); printf("\n"); v[ss]=0; return; } int que[50],cnt=0; for(int i=0;i<26;++i){ if(ma[ss][i])id[i]--; if(vis[i]&&!id[i]&&!v[i])que[++cnt]=i; } for(int i=1;i<=cnt;++i)dfs(que[i],t+1); for(int i=0;i<26;++i)if(ma[ss][i])id[i]++; v[ss]=0; } int main(){ int ccnt=0; while(scanf("%s",s)!=EOF){ if(ccnt++)printf("\n"); memset(ma,0,sizeof(ma)); memset(id,0,sizeof(id)); memset(vis,0,sizeof(vis)); memset(v,0,sizeof(v)); n=0; vis[s[0]-'a']=1; n++; char c1,c2; while(c1=getchar()){ if(c1=='\n')break; if(c1>'z'||c1<'a')continue; int cc=c1-'a'; if(!vis[cc]){ vis[cc]=1; n++; } } bool f=1; while(f){ c1=read(); if(c1=='\n')break; c2=read(); int cc1=c1-'a',cc2=c2-'a'; if(!ma[cc1][cc2]){ ma[cc1][cc2]=1; id[cc2]++; } } for(int i=0;i<26;++i)if(vis[i]&&!id[i])dfs(i,1); } return 0; }
View Code
相关文章推荐
- 心理学定律第一篇
- PXE+kickstart实现自动安装centOS6.5
- UML学习的一篇好文章
- WebService学习笔记(三)客户端Demo
- Android 保存图片到SQLite,读出SQLite中的图片
- 多个数的最小公倍数
- 在windows上模拟linux环境
- IDEA 快捷键参考
- 《刀塔传奇》付费设计分析
- hdu 1019 Least Common Multiple
- linux mysql迁移
- 找不到mysql.sock的出现原因及解决方案和mysql 默认mysql.sock位置默认问题探讨
- mysql 设置 utf-8
- 2015应届生薪酬待遇丨看完请别哭
- JAVA项目注意点:翻页乱码问题
- Windows 下后台运行命令行程序
- Unity平滑相机跟随
- zoj3822 期望dp
- IOS 数据库升级
- 取拍卖纪录中出价最高的人