Topological sorting template (title)

Topological sorting
 
Topology: a cycloalkyl ⽆ to FIG.
In topological order, all pointing to the side of the start point x, x are before point.
 
Fake code:
The START 0 degree point queue filling with 
while(l<r){ 
   int x = q [++ i]; 
   for (int i = point [x]; i; i = next [i]) // This is the adjacency table is written, can also be converted to vector
  {
    in[to[i]]- -;
    if(in[to[i])==0)
    q[++r]=to[i]; 
   }
 
/ * 

CF510C Fox And Names 
meaning of the questions translated 

remember familiar lexicographically it? There are a number according to a lexicographic order is changed (the order of 26 letters is no longer abcdefg ... xyz) sorted string, its request lexicographically. 
(There are multiple Solutions, please output an arbitrary set) 
otherwise the output Impossible (note the case) 

data string very happy they have a range of up to 100 characters 

to other restrictions on the right to see 
the title description 

Fox Ciel is going to publish a paper on FOCS ( Operated Computer Systems Foxes, pronounce: "Fox") She the Heard A Rumor:. at The List in the authors at The Paper IS ON Always at The lexicographical sorted in the Order. 

the After Checking some examples, SHE found that Sometimes OUT IT WAS not to true the On some Papers. authors' names were not sorted in lexicographical order in normal sense. But it was always true that after some modification of the order of letters in alphabet, the order of authors becomes lexicographical!

She wants to know, if there exists an order of letters in Latin alphabet such that the names on the paper she is submitting are following in the lexicographical order. If so, you should find out any such order.

Lexicographical order is defined in following way. When we compare s s s and t t t , first we find the leftmost position with differing characters: si≠ti s_{i}≠t_{i} si?≠ti? . If there is no such position (i. e. s s s is a prefix of t t t or vice versa) the shortest string is less. Otherwise, we compare characters si s_{i} si? and ti t_{i} ti? according to their order in alphabet.
输入输出格式
输入格式:

The first line contains an integer n n n ( 1<=n<=100 1<=n<=100 1<=n<=100 ): number of names.

Each of the following n n n lines contain one string namei name_{i} namei? ( 1<=∣namei∣<=100 1<=|name_{i}|<=100 1<=∣namei?∣<=100 ), the i i i -th name. Each name contains only lowercase Latin letters. All names are different.

输出格式:

If there exists such order of letters that the given names are sorted lexicographically, output any such order as a permutation of characters 'a'–'z' (i. e. first output the first letter of the modified alphabet, then the second, and so on).

Otherwise output a single word "Impossible" (without quotes).
Petr
Tourist
10
Input Sample # 2: Copy
bcdefghijklmnopqrsatuvwxyz
output Sample # 1: Copy
Adleman
Shamir
Rivest
. 3
Input Sample # 1: Copy

Sample Input Output





wjmzbmr
yeputons 
vepifanov 
scottwu 
oooooooooooooooo 
Subscriber 
rowdark 
tankengineer 

output Sample # 2: Copy 

Impossible 

Input Sample # 3: Copy 

10 
Petr 
Egor 
endagorion 
feferivan 
ilovetanyaromanova 
Kostka 
dmitriyh 
maratsnowbear 
bredorjaguarturnik 
cgyforever 

output sample # 3: Copy 

aghjlnopefikdmbcqrstuvwxyz 

Input Sample # 4: Copy 

. 7 
CAR 
Care 
careful 
Carefully 
becarefuldontforgetsomething 
otherwiseyouwillbehacked 
Goodluck 

output sample # 4: copy 

acbdefhijklmnogpqrstuvwxyz 



* /
#include<bits/stdc++.h>
using namespace std;
struct edge{
    int next,to;
}e[1005];
int point[1005],cnt;
int l,r,q[1005],n;
char s[110][110];
int in[1005];
void addedge(int x,int y){
    e[++cnt].next=point[x];
    e[cnt].to=y;
    point[x]=cnt;
}
void toposort(){
    l=r=0;
    for(int i=0;i<26;i++)
        if(in[i]==0)
            q[++r]=i;
    while(l<r){
        int x=q[++l];
        for(int i=point[x];i;i=e[i].next){//用vector就直接<size()就行了,不用next 
            int y=e[i].to;
            in[y]--;
            if(in[y]==0)
                q[++r]=y;
        }
    }//队列里就是拓扑序 
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%s",s[i]);
    for(int i=1;i<n;i++){
        int len1=strlen(s[i]);
        int len2=strlen(s[i+1]);
        bool flag=0;
        for(int j=0;j<min(len1,len2);j++)
            if(s[i][j]==s[i+1][j])
                continue;
            else{
                flag=1;
                in[s[i+1][j]-'a']++;
                addedge(s[i][j]-'a',s[i+1][j]-'a');
                break;
            }
        if(flag==0 &&len2<len1){
            printf("Impossible");
            return 0;
        }
    }
    toposort();
    if(l<26)
        printf("Impossible");
    else
        for(int i=1;i<=26;i++)
            printf("%c",q[i]+'a');

        
    
    return 0;
 } 

 

Guess you like

Origin www.cnblogs.com/Tidoblogs/p/11222357.html
Recommended