POJ 1270 Following Orders (拓扑排序,dfs枚举)
2013-10-13 10:30
316 查看
题意:每组数据给出两行,第一行给出变量,第二行给出约束关系,每个约束包含两个变量x,y,表示x<y。
要求:当x<y时,x排在y前面。让你输出所有满足该约束的有序集。
思路:用拓扑排序,dfs枚举即可,为简便起见,这里将字符变量转化为整型值存储。
要求:当x<y时,x排在y前面。让你输出所有满足该约束的有序集。
思路:用拓扑排序,dfs枚举即可,为简便起见,这里将字符变量转化为整型值存储。
#include <iostream> #include <stdio.h> #include <string> #include <cstring> #include <algorithm> using namespace std; int node[30],num; //num为变量的个数,node存储变量对应的整型值 int edge[30][30]; //edge[i][j]=1表示i<j。 int into[30]; //表示i的入度 //u表示此次选的是第u个变量,idx表示目前选了idx个变了,s是输出的结果字符串 void topo_dfs(int u,int idx,string s){ if(u!=-1) s+=char(node[u]+'a'); if(idx==num){ cout<<s<<endl; return; } for(int i=0;i<num;i++){ //选出入度为0的变量,将与它相连的点的入度-1。 if(into[node[i]]==0){ into[node[i]]=-1; for(int j=0;j<26;j++){ if(edge[node[i]][j]){ into[j]--; } } //一开始第一个参数传了node[i]。。。 topo_dfs(i,idx+1,s); //最后别忘了恢复 into[node[i]]=0; for(int j=0;j<26;j++){ if(edge[node[i]][j]){ into[j]++; } } } } } int main() { char str1[100],str2[300]; int u,v,len1,len2; while(gets(str1)){ gets(str2); memset(edge,0,sizeof(edge)); memset(into,0,sizeof(into)); num=0; len1=strlen(str1); len2=strlen(str2); for(int i=0;i<len1;i+=2){ u=str1[i]; node[num++]=u-'a'; } //这里排序,是为了之后dfs枚举的顺序按照字典顺序 sort(node,node+num); for(int i=0;i<len2;i+=4){ u=str2[i]-'a'; v=str2[i+2]-'a'; edge[u][v]=1; into[v]++; //注意啦,这里into的下标是v,不是node数组中的索引!!!一开始dfs中into就是用的索引,导致样例一直不过。。。 } topo_dfs(-1,0,""); puts(""); } return 0; }
相关文章推荐
- Poj 1270 Following Orders【Dfs拓扑排序】
- POJ 1753 Flip Game 翻转(枚举+dfs)
- poj Flip Game(DFS)(枚举)
- POJ 1270 Following Orders 拓扑排序全输出
- poj_1753 Flip Game(dfs+枚举)/(bfs+位运算)
- poj 棋盘问题(经典DFS)(枚举)
- POJ 1753(DFS+枚举||BFS+位运算)
- POJ 1753 Flip Game (DFS + 枚举)
- poj 2157 Maze 枚举排列+dfs搜迷宫
- POJ 1753 Flip Game (DFS + 枚举)
- POJ 1270 Following Orders(拓扑排序:输出所有可能)
- POJ 1094 拓扑排序(dfs+删边)
- poj Flip Game(DFS)(枚举)
- POJ 2965 The Pilots Brothers' refrigerator 枚举dfs
- poj 棋盘问题(经典DFS)(枚举)
- POJ 1753 Flip Game(枚举+DFS)
- poj 1426 Find The Multiple(dfs || 二进制枚举)
- poj-1270 Following Orders(拓扑排序)
- poj 3600 Subimage Recognition (枚举+dfs)
- POJ 2922 Honeymoon Hike (dfs+二分答案+区间枚举)