poj1270 Following Orders

来源:互联网 发布:典型数据报表图片 编辑:程序博客网 时间:2024/06/03 21:58

poj1270

在找入度0的拓扑排序算法基础上,加入回溯,对入度被减掉的点进行还原,即可找到所有拓扑序列。对于字典序最小可以先对原序列排序。

#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>using namespace std;int g[30][30], in[30], tp[30], n;char s[30];int getit(int ch){    for(int i = 1; i < n; i++)        if(s[i] == ch) return i;}bool init(){    char ch;    n = 0;    while((ch = getchar()) != '\n'){        if(ch == EOF) return false;        if(ch != ' ') s[++n] = ch;    }    s[++n] = '\0';    sort(s+1, s+n);    memset(in, 0, sizeof(in));    memset(g, 0, sizeof(g));    while(true){        while((ch = getchar()) == ' ');        if(ch == EOF) return false;        if(ch == '\n') break;        int u = getit(ch);        while((ch = getchar()) == ' ');        int v = getit(ch);        g[u][v] = 1;        in[v]++;    }    return true;}void dfs(int now){    if(now == n){        for(int i = 1; i < n; i++)            printf("%c", s[tp[i]]);        puts("");        return;    }    for(int i = 1; i < n; i++){        if(in[i] == 0){            in[i] = -1;            tp[now] = i;            for(int j = 1; j < n; j++)                if(g[i][j]) in[j]--;            dfs(now+1);            in[i] = 0;            for(int j = 1; j < n; j++)                if(g[i][j]) in[j]++;        }    }}void work(){    while(init()){        dfs(1);        puts("");    }}int main(){    work();    return 0;}
0 0
原创粉丝点击