G - Sorting It All Out -n次拓扑唯一序

  • G - Sorting It All Out

  •  POJ - 1094
  • 题意:好像就是先告诉你他要用26个字母的前n个字母,然后给你m条对这n个字母的限制,每一条限制这n个字母其中的两个的先后关系,问你通过这些限制条件能不能确定这n的字母的序列。注意:当存在冲突或者拓扑排序成功时,之后的输入不对结果造成影响。
  • A<B即可以理解成存在边A-B。n个点组成的图,给你m条边。问你该图是否为DAG(无有向环图)然后是否拓扑序唯一,最后求拓扑序。
  • 注意拓扑序必须得唯一的确定所以控制一下每次的入队数目,
  • //
    //                                       /*
    //                                      +
    //                                     +
    //                                    +
    //                                    +
    //                                    [         >i>n[t
    //                                     */   #include<stdio.h>
    //                        /*2w0,1m2,]_<n+a m+o>r>i>=>(['0n1'0)1;
    //                     */int/**/main(int/**/n,char**m){FILE*p,*q;int        A,k,a,r,i/*
    //                   #uinndcelfu_dset<rsitcdti_oa.nhs>i/_*/;char*d="P%"   "d\n%d\40%d"/**/
    //                 "\n%d\n\00wb+",b[1024],y[]="yuriyurarararayuruyuri*daijiken**akkari~n**"
    //          "/y*u*k/riin<ty(uyr)g,aur,arr[a1r2a82*y2*/u*r{uyu}riOcyurhiyua**rrar+*arayra*="
    //       "yuruyurwiyuriyurara'rariayuruyuriyuriyu>rarararayuruy9uriyu3riyurar_aBrMaPrOaWy^?"
    //      "*]/f]`;hvroai<dp/f*i*s/<ii(f)a{tpguat<cahfaurh(+uf)a;f}vivn+tf/g*`*w/jmaa+i`ni("/**
    //     */"i+k[>+b+i>++b++>l[rb";int/**/u;for(i=0;i<101;i++)y[i*2]^="~hktrvg~dmG*eoa+%squ#l2"
    //     ":(wn\"1l))v?wM353{/Y;lgcGp`vedllwudvOK`cct~[|ju {stkjalor(stwvne\"gt\"yogYURUYURI"[
    //     i]^y[i*2+1]^4;/*!*/p=(n>1&&(m[1][0]-'-'||m[1][1]  !='\0'))?fopen(m[1],y+298):stdin;
    //      /*y/riynrt~(^w^)],]c+h+a+r+*+*[n>)+{>f+o<r<(-m]    =<2<5<64;}-]-(m+;yry[rm*])/[*
    //       */q=(n<3||!(m[2][0]-'-'||m[2][1]))?stdout /*]{     }[*/:fopen(m[2],d+14);if(!p||/*
    //       "]<<*-]>y++>u>>+r >+u+++y>--u---r>++i+++"  <)<      ;[>-m-.>a-.-i.++n.>[(w)*/!q/**/)
    //    return+printf("Can "  "not\x20open\40%s\40"    ""       "for\40%sing\n",m[!p?1:2],!p?/*
    //  o=82]5<<+(+3+1+&.(+  m  +-+1.)<)<|<|.6>4>-+(>    m-        &-1.9-2-)-|-|.28>-w-?-m.:>([28+
    // */"read":"writ");for  (   a=k=u= 0;y[u];  u=2    +u){y[k++   ]=y[u];}if((a=fread(b,1,1024/*
    //,mY/R*Y"R*/,p/*U*/)/*          R*/ )>/*U{  */   2&& b/*Y*/[0]/*U*/=='P' &&4==/*"y*r/y)r\}
    //*/sscanf(b,d,&k,& A,&           i,  &r)&&        !   (k-6&&k -5)&&r==255){u=A;if(n>3){/*
    //]&<1<6<?<m.-+1>3> +:+ .1>3+++     .   -m-)      -;.u+=++.1<0< <; f<o<r<(.;<([m(=)/8*/
    //u++;i++;}fprintf   (q,    d,k,           u      >>1,i>>1,r);u  = k-5?8:4;k=3;}else
    //  /*]>*/{(u)=/*{   p> >u  >t>-]s                >++(.yryr*/+(    n+14>17)?8/4:8*5/
    //     4;}for(r=i=0  ;  ;){u*=6;u+=                (n>3?1:0);if    (y[u]&01)fputc(/*
    //      <g-e<t.c>h.a r  -(-).)8+<1.                 >;+i.(<)<     <)+{+i.f>([180*/1*
    //      (r),q);if(y[u   ]&16)k=A;if                               (y[u]&2)k--;if(i/*
    //      ("^w^NAMORI; {   I*/==a/*"                               )*/){/**/i=a=(u)*11
    //       &255;if(1&&0>=     (a=                                 fread(b,1,1024,p))&&
    //        ")]i>(w)-;} {                                         /i-f-(-m--M1-0.)<{"
    //         [ 8]==59/* */                                       )break;i=0;}r=b[i++]
    //            ;u+=(/**>>                                     *..</<<<)<[[;]**/+8&*
    //            (y+u))?(10-              r?4:2):(y[u]         &4)?(k?2:4):2;u=y[u/*
    //             49;7i\(w)/;}             y}ru\=*ri[        ,mc]o;n}trientuu ren (
    //             */]-(int)'`';}             fclose(          p);k= +fclose( q);
    //              /*] <*.na/m*o{ri{                       d;^w^;}  }^_^}}
    //               "   */   return  k-                -1+   /*\'   '-`*/
    //                     (   -/*}/   */0x01        );       {;{    }}
    //
    #include<iostream>
    #include<cstring>
    #include<vector>
    #include<queue>
    using namespace std;
    #define maxn 50
    int g[maxn][maxn],o[maxn];
    int n,m,in[maxn],ans,sum;
    vector<pair<char,char> >mmp;
    bool ff;
    void topo()
    {
        sum=0;
        queue<int>q;
        for(int i=0; i<n; i++)
            if(in[i]==0)
            {
                sum++;
                q.push(i);
                o[ans++]=i;
                if(sum>1)
                    ff=0;
            }
        while(!q.empty())
        {
            int top=q.front();
            q.pop();
            sum=0;
            for(int i=0; i<n; i++)
            {
                if(g[top][i])
                {
                    in[i]--;
                    if(in[i]==0)
                    {
                        sum++;
                        if(sum>1)
                            ff=0;
                        q.push(i);
                        o[ans++]=i;
                    }
                }
            }
        }
    }
    int main()
    {
        char a,b,s;
        while(cin>>n>>m)
        {
            if(n==0)
                break;
            bool flag=1;
            mmp.clear();
            memset(in,0,sizeof(in));
            memset(g,0,sizeof(g));
            while(m--)
            {
                cin>>a>>s>>b;
                mmp.push_back(make_pair(a,b));
            }
            for(int j=1; j<=mmp.size(); j++)
            {
                ff=1;
                memset(in,0,sizeof(in));
                ans=0;
                for(int i=0; i<j; i++)
                {
                    g[mmp[i].second-'A'][mmp[i].first-'A']=1;
                    in[mmp[i].first-'A']++;
                }
                topo();
                if(ans==n&&ff)
                {
                    cout<<"Sorted sequence determined after "<<j<<" relations: ";
                    for(int k=ans-1; k>=0; k--)
                    {
                        char temp='A'+o[k];
                        cout<<temp;
                    }
                    cout<<"."<<endl;
                    flag=0;
                    break;
                }
                else if(ans<n)
                {
                    cout<<"Inconsistency found after "<<j<<" relations."<<endl;
                    flag=0;
                    break;
                }
            }
            if(flag)cout<<"Sorted sequence cannot be determined."<<endl;
        }
        return 0;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值