-
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; }
G - Sorting It All Out -n次拓扑唯一序
最新推荐文章于 2023-06-24 04:52:25 发布