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; }