POJ 1270 Following Orders (拓扑 + DFS回溯)

来源:互联网 发布:钱德勒宾 知乎 编辑:程序博客网 时间:2024/05/18 01:12

DFS搞了半天  , 仔细 思考 回溯 (每一次 都是 本层全新的状态) 加上记录方案

代码确实很挫

#include<stdio.h>#include<string.h>#include<stdlib.h>#include<vector>using namespace std;#define max(a,b) (a)>(b)? (a):(b)#define min(a,b) (a)>(b)? (b):(a)#define INF 100000000#define N 100#define M 200vector<int> edge[N];char name[N];int ar_na;int in[N];int n,m;int dui[N];char str1[2*N];char str2[2*M];int vis[N];int head,tail;char ans[500][N];int ar_an;int ff(char ch){    for(int i=0;i<ar_na;i++)    {        if(name[i]==ch) return i;    }}int cmp(const void *a,const void *b){    return ( strcmp( (char *)a,(char *)b));}void  dfs(){    int i,j,k;    int flag=0;    while(head<tail)    {        int now=dui[head++];        for(j=0; j<edge[now].size(); j++)        {            int next=edge[now][j];            in[next]--;        }    }    for(i=0;i<ar_na;i++)    {        if(in[i]==0 && !vis[i])        {            flag=1;            vis[i]=1;            dui[tail++]=i;            dfs();            tail--;            int tem=dui[--head];            for(j=0;j<edge[tem].size();j++)            {                int tt=edge[tem][j];                in[tt]++;            }            vis[i]=0;        }    }    if(!flag)    {        if(tail>=ar_na)        {            for(i=0;i<tail;i++)            {                ans[ar_an][i]=name[dui[i]];            }            ans[ar_an][tail]='\0';            ar_an++;        }        return ;    }}int main(){    //freopen("in.txt","r",stdin);    int i,j,k;    while(gets(str1)!=NULL)    {        int len=strlen(str1);        ar_na=0;        ar_an=0;        memset(in,0,sizeof(in));        for(i=0;i<=N;i++) edge[i].clear();        memset(vis,0,sizeof(vis));        for(i=0;i<len;i++)        {            if(str1[i]!=' ')            {                name[ar_na++]=str1[i];            }        }        gets(str2);        int len1=strlen(str2);        int fl=0;        int last,now;        for(i=0;i<len1;i++)        {            if(str2[i]!=' ')            {                fl=!fl;                if(fl)                {                    last=ff(str2[i]);                }                else                {                    now=ff(str2[i]);                    in[now]++;                    edge[last].push_back(now);                }            }        }        head=tail=0;        dfs();        if(ar_an==0) puts("");        else        {            qsort(ans,ar_an,sizeof(char)*N,cmp);            for(i=0;i<ar_an;i++) puts(ans[i]);        }        puts("");    }    return 0;}


原创粉丝点击