标签:list 输入输出 Fix color upper ide cstring print 技术
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 5473 | Accepted: 2239 |
Description
Input
Output
Sample Input
a b f g a b b f v w x y z v y x v z v w v
Sample Output
abfg abgf agbf gabf wxzvy wzxvy xwzvy xzwvy zwxvy zxwvy
题目大意:
给你一个有向无环图,请你按字典序输出它所有的toposort结果。
回溯法。
回溯时如果使用了全局变量,要在递归出口处立即还原该全局变量,如ac代码中的vis数组和path数组。
此题输入输出好坑啊。用gets才行,I also not kow why。
#include<cstdio> #include<algorithm> #include<cstring> #include<queue> #include<stack> typedef long long ll; const int maxn=10000; char str1[100],str2[300]; int exis[26];//26个lowercase字母 int tot;//一共存在多少字母 int cnt; int to[100]; int next[100]; int head[26]; int in[26];//入度 int vis[26]; char path[30]; void dfs(int x,int m) { if(m==tot-1) printf("%s\n",path); for(int i=head[x];i!=-1;i=next[i]) { int l=to[i]; if(!vis[l]) in[l]--; } for(int i=0;i<26;i++) { if(!vis[i]&&exis[i]&&in[i]==0) { vis[i]=1; path[m+1]=‘a‘+i; dfs(i,m+1); path[m+1]=‘\0‘; vis[i]=0; } } for(int i=head[x];i!=-1;i=next[i]) { int l=to[i]; if(!vis[l]) in[l]++; } } int main() { int k=0; while(gets(str1)) { gets(str2); if(k>0) printf("\n"); k++; memset(exis,0,sizeof(exis)); tot=0; for(int i=0;str1[i]!=‘\0‘;i++) { if(str1[i]>=‘a‘&&str1[i]<=‘z‘) { exis[str1[i]-‘a‘]=1; tot++; } } cnt=0; memset(head,-1,sizeof(head)); memset(in,0,sizeof(in)); for(int i=0;str2[i]!=‘\0‘;i+=4) { int u=str2[i]-‘a‘,v=str2[i+2]-‘a‘; to[cnt]=v;next[cnt]=head[u];head[u]=cnt++; in[v]++; } memset(vis,0,sizeof(vis)); for(int i=0;i<30;i++) path[i]=‘\0‘; for(int i=0;i<26;i++) { if(exis[i]&&in[i]==0) { vis[i]=1; path[0]=‘a‘+i; dfs(i,0); path[0]=‘\0‘; vis[i]=0; } } } return 0; }
poj 1270 Following Orders (拓扑排序+回溯)
标签:list 输入输出 Fix color upper ide cstring print 技术
原文地址:https://www.cnblogs.com/acboyty/p/9974644.html