zoukankan      html  css  js  c++  java
  • 拓扑排序模板(题)

    拓扑排序
     
    拓扑图:有向⽆环图
    在拓扑序中,所有指向x点的边的起点,都在x点之前。
     
    伪代码:
    将⼊度为0的点加⼊队列 
    while(l<r){ 
       int x=q[++l]; 
       for(int i=point[x];i;i=next[i]) //这是邻接表的写法,也可以转化为vector
      {
        in[to[i]]- -;
        if(in[to[i])==0)
        q[++r]=to[i]; 
       }
     
    /*
    
    CF510C Fox And Names
    题意翻译
    
    记得熟悉的字典序吗? 现在有一些按照某个被改变的字典序(26个字母的顺序不再是abcdefg...xyz)排序后的字符串,请求出其字典序。
    (存在多组解,请输出任意一组)
    否则输出 Impossible(请注意大小写)
    
    数据范围 字符串很开心自己有至多100个字符
    
    其他限制 见右边
    题目描述
    
    Fox Ciel is going to publish a paper on FOCS (Foxes Operated Computer Systems, pronounce: "Fox"). She heard a rumor: the authors list on the paper is always sorted in the lexicographical order.
    
    After checking some examples, she found out that sometimes it wasn't true. On some papers authors' names weren't 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).
    
    输入输出样例
    输入样例#1: 复制
    
    3
    rivest
    shamir
    adleman
    
    输出样例#1: 复制
    
    bcdefghijklmnopqrsatuvwxyz
    
    输入样例#2: 复制
    
    10
    tourist
    petr
    wjmzbmr
    yeputons
    vepifanov
    scottwu
    oooooooooooooooo
    subscriber
    rowdark
    tankengineer
    
    输出样例#2: 复制
    
    Impossible
    
    输入样例#3: 复制
    
    10
    petr
    egor
    endagorion
    feferivan
    ilovetanyaromanova
    kostka
    dmitriyh
    maratsnowbear
    bredorjaguarturnik
    cgyforever
    
    输出样例#3: 复制
    
    aghjlnopefikdmbcqrstuvwxyz
    
    输入样例#4: 复制
    
    7
    car
    care
    careful
    carefully
    becarefuldontforgetsomething
    otherwiseyouwillbehacked
    goodluck
    
    输出样例#4: 复制
    
    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;
     } 
  • 相关阅读:
    超级女声杭州赛区7进5
    究竟怎么了?
    最近发现
    S2SH基于角色权限拦截
    基于S2SH的电子商务网站系统性能优化
    TSQL复习笔记(一)
    用户sa登录失败,该用户与可信sql server连接无关联
    SQL附加数据库报5120的错误的解决办法
    DotNet中配置文件的使用(一)
    JQuery中使用AJAX $.ajax(prop)方法详解
  • 原文地址:https://www.cnblogs.com/Tidoblogs/p/11222357.html
Copyright © 2011-2022 走看看