| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 4059 | Accepted: 1623 |
Description
Input
Output
Sample Input
a b f g a b b f v w x y z v y x v z v w v
Sample Output
abfg abgf agbf gabf wxzvy wzxvy xwzvy xzwvy zwxvy zxwvy
Source
题意:给定一串字符(互异),再给出一个字符序列,表示一种前后关系,如a b e f c d,表示a<b,e<f,c<d。
将开始给出的字符进行排序,使之符合这个关系序列。并按字典序输出这些符合要求的字符序列。
#include<stdio.h>
#include<vector>
#include<string.h>
using namespace std;
const int N = 30;
int in[N],exist[N],mapt[N][N],path[N],n;
void topeSort(int u,int k)
{
path[k]=u;
if(k==n)
{
for(int i=1;i<=n;i++)
printf("%c",path[i]+'a');
printf("\n");
return ;
}
in[u]=-1;
for(int i=0;i<26;i++)
if(mapt[u][i])
in[i]-=mapt[u][i];
for(int i=0;i<26;i++)
if(exist[i]&&!in[i])
topeSort(i,k+1);
in[u]=0;
for(int i=0;i<26;i++)
if(mapt[u][i])
in[i]+=mapt[u][i];
}
int main()
{
int flag=0;
char str[1000];
while(gets(str))
{
if(flag)printf("\n"); flag=1;
memset(in,0,sizeof(in));
memset(exist,0,sizeof(exist));
memset(mapt,0,sizeof(mapt));
n=0;
for(int i=0;str[i]!='\0';i++)
if(str[i]>='a'&&str[i]<='z')
{
int ch=str[i]-'a';
if(exist[ch]==0)
n++;
exist[ch]=1;
}
gets(str);
int i=0,a,b;
while(str[i]!='\0')
{
while(str[i]==' ')i++; a=str[i++]-'a';
while(str[i]==' ')i++; b=str[i++]-'a';
mapt[a][b]++; in[b]++;
}
for(int i=0;i<26;i++)
if(exist[i]&&!in[i])
topeSort(i,1);
}
}
POJ1270 Following Orders(拓扑排序)
原文地址:http://blog.csdn.net/u010372095/article/details/45365435