zoukankan      html  css  js  c++  java
  • POJ 1270 Following Orders (拓扑排序,dfs枚举)

    题意:每组数据给出两行,第一行给出变量,第二行给出约束关系,每个约束包含两个变量x,y,表示x<y。      

         要求:当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;
    }
  • 相关阅读:
    svn鉴权方法
    我收藏的技术网站
    linux下apache+svn的安装
    svn安装失败解决方法
    编译器扩展deprecated
    svn静态库依赖关系
    Linux用户和组
    boost之简介、编译、安装和使用
    svn数据库认证方法
    svn版本库目录结构
  • 原文地址:https://www.cnblogs.com/chenxiwenruo/p/3366408.html
Copyright © 2011-2022 走看看