uva 124 Following Orders 拓扑排序输出全部序列

来源:互联网 发布:jdk 8 linux x64.gz 编辑:程序博客网 时间:2024/06/05 10:30

一道裸的拓扑排序,回溯输出全部序列即可。还有就是我自己太懒,最后多出了一空行结果wa了一次,还查了半天。。。。

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <vector>#define N 310using namespace std;int g[N][N];int ru[N];int vis[N];int len;char s[N],str[N];vector <int> vec;void dfs(int now){    if(vec.size()>len-1)    {        for(int i=0;i<vec.size();i++){            printf("%c",vec[i]+'a'-1);        }        printf("\n");        return ;    }    int i;    for(i=0;i<len;i++){        if(g[now][str[i]-'a'+1]==1 && ru[str[i]-'a'+1]!=0 ){            ru[str[i]-'a'+1]--;        }    }    for(int j=0;j<len;j++){        if(ru[str[j]-'a'+1]==0 && vis[str[j]-'a'+1]==0){            vec.push_back(str[j]-'a'+1);            vis[str[j]-'a'+1]=1;            dfs(str[j]-'a'+1);            vis[str[j]-'a'+1]=0;            vec.pop_back();            //ru[str[j]-'a'+1]++;        }    }    for(i=0;i<len;i++){        if(g[now][str[i]-'a'+1]==1){            ru[str[i]-'a'+1]++;        }    }//之前这一块没写好,即恢复路径没有做好}int main(){    int con=0;    while(gets(s)){        vec.clear();        int cnt=0;        for(int i=0;i<strlen(s);i++){            str[cnt]=s[i];            i++;            cnt++;        }        sort(str,str+cnt);        gets(s);        memset(g,0,sizeof(g));        memset(ru,0,sizeof(ru));        memset(vis,0,sizeof(vis));        for(int i=0;i<strlen(s)-2;i+=4){            if(g[s[i]-'a'+1][s[i+2]-'a'+1]==0){                g[s[i]-'a'+1][s[i+2]-'a'+1]=1;                ru[s[i+2]-'a'+1]++;            }        }        if(con==0){            con++;        }        else{            printf("\n");        }        len=cnt;        for(int i=0;i<len;i++){            if(ru[str[i]-'a'+1]==0){                vec.push_back(str[i]-'a'+1);                vis[str[i]-'a'+1]=1;                dfs(str[i]-'a'+1);                vis[str[i]-'a'+1]=0;                vec.pop_back();            }        }    }    return 0;}


 

0 0
原创粉丝点击