阅读了http://duanple.blog.163.com/blog/static/709717672008101683333501/
以及 http://blog.csdn.net/lyy289065406/article/details/6645999
但最后发现题目中应该是并不会出现后文中提到的非前n个字母的情况。
存放结点时 使用了后文中struct node
{
int fromCount;//入度
char to[MAX_SIZE];//指向的其它点
int toCount;//出度
}的结构。
在判断是否有环存在及是否完全排好序 使用了前文中的思想。
本题思路:
1.每输入一对字母,都对已经输入的关系重新进行一次拓扑排序,得到的序列存放到 stack数组中,stack数组序列中字母的个数为top。
注意,在最初始状态下进行拓扑排序后top就已经为n,因为所有的点的入度都为0,都会依次放入到stack数组。
2.如果top<n,则证明有环存在,直接输出 cout << "Inconsistency found after "<< relationNo <<" relations."<<endl;并且不再处理后续的输入数据。
3.如果top=n,此时得分情况讨论。
(1)对stack数组中的所有每相邻的两个元素挨个比较进行判断,如果g[stack[i]][stack[i+1]]==0,则表示该两相邻元素还不能确定大小关系,即通过已知关系还不能完全确定所有数据间的大小关系。因此继续通过后续的输入数据进行判断。
(1).如果此时挨个比较stack数组中的所有每相邻的两个元素都能保证stack[i]对应的字母都小于stack[i+1]对应的字母 (对应程序中为g[stack[i]][stack[i+1]]==1),则表示已经排好序了,此时输出cout << "Sorted sequence determined after "<< relationNo <<" relations: ",并且将stack数组元素依次输出。
代码如下:
//Memory Time
//260K 0MS
#include<iostream>
using namespace std;
const int MAX_SIZE = 26;
int n,m;
int g[MAX_SIZE][MAX_SIZE];
struct node
{
int fromCount;//入度
char to[MAX_SIZE];//指向的其它点
int toCount;//出度
}tempv[MAX_SIZE],v[MAX_SIZE];//之所以定义两个,是因为每输入一行就进行top排序,且过程中会对原有的图的结点数据进行改动导致破坏了原数据,所以每次改变只针对tempv
bool topsort(int g[][MAX_SIZE],int relationNo)
{
int i,j,start;
int stack[MAX_SIZE];//存储最后拓扑完成的序列
bool vist[MAX_SIZE];//标识是否已经访问过
int iscomplete=false;//是否完成了,完成是指发现环或者完全能确定字母序列的所有顺序(两两能比较)
char ch;//便于完全能决定顺序时输出stack数组中的每个元素,这里只是为了以字符输出,如果直接输出stack[i]+'A' 默认以数字输出,所以先赋值给ch以达到转化为char的目的
int top=0;
memset(vist,false,sizeof(vist));//每次都重新拓扑
for(i=0;i<n;i++)//每次都重新获取原图数据,防止受到之前拓扑排序过程中对数据改动的影响
{
tempv[i].fromCount=v[i].fromCount;
tempv[i].toCount=v[i].toCount;
for(j=0;j<n;j++)
{
tempv[i].to[j]=v[i].to[j];
}
}
while(true)
{
start=-1;
for(i=0;i<n;i++)
{
if(!vist[i] && tempv[i].fromCount==0)//每次找入度为0的点
{
start=i;
break;
}
}
if(start<0)//表明已经完成拓扑排序
break;
stack[top++]=start;
for(i=0;i<tempv[start].toCount;i++)//删除该结点(vist[start]=true 模拟),删除指向其它点的边(指向的点入度减一)
{
tempv[tempv[start].to[i]].fromCount--;
}
vist[start]=true;
}
if(top<n)//发现环
{
cout << "Inconsistency found after "<< relationNo <<" relations."<<endl;
return true;
}
else
{
iscomplete=true;
for(i=0;i<top-1;i++)
{
if(!g[stack[i]][stack[i+1]])
{
iscomplete=false;
break;
}
}
if(iscomplete)//已经完全有序,则直接输出并返回,不再理会后续任何输入数据
{
cout << "Sorted sequence determined after "<< relationNo <<" relations: ";
for(i=0;i<top;i++)
{
ch = stack[i]+'A';
cout << ch;
}
cout << "." << endl;
return true;
}
else//还没有完全有序,需要继续通过后续输入判断
{
return false;
}
}
}
int main()
{
// freopen("in.txt","r",stdin); 便于大量数据复制到文件中作为测试数据
int i,l,r;
bool complete;
while(1)
{
char temp[5];
complete=false;
memset(g,0,sizeof(g));
for(i=0;i<MAX_SIZE;i++)
{
tempv[i].fromCount=v[i].fromCount=0;
tempv[i].toCount=v[i].toCount=0;
memset(v[i].to,'\0',sizeof(v[i].to));
memset(tempv[i].to,'\0',sizeof(tempv[i].to));
}
cin >> n >> m;
if(n==0 && m==0)
{
break;
}
for(i=0;i<m;i++)
{
cin >> temp;
l=temp[0]-'A';
r=temp[2]-'A';
g[l][r]=1;
v[r].fromCount++;
v[l].to[v[l].toCount++]=r;
if(!complete)//只有未完成时才继续进行拓扑排序
{
complete = topsort(g,i+1);
}
}
if(!complete)//直到所有数据都输入完并且没有出现环也不能完全确定顺序才输入不能确定
{
cout<<"Sorted sequence cannot be determined."<<endl;
}
}
// fclose(stdin);
return 0;
}
poj上 qlyzpqz贡献的测试数据及测试结果:
Posted by qlyzpqz at 2009-11-07 22:54:20 on Problem 1094 and last updated at 2009-11-07 22:55:03
4 6 D<B D<A D<C C<A C<B A<B 10 40 C<I E<G A<J F<B D<E F<D C<B E<H G<I D<B C<H A<B J<I D<G A<E C<G E<B H<G C<A F<J B<G D<J E<J D<H C<F B<J G<J B<H D<A F<I A<H C<E F<H A<G B<I F<A H<J F<G F<E C<J 15 60 B<M M<H N<G N<E I<D B<D A<J O<D D<J F<E I<L F<B I<C C<E I<K I<J A<E B<L G<J A<G N<H H<J K<N K<E F<J C<D K<M G<L F<H M<L A<K B<K E<L B<H F<D M<E M<G N<L O<J D<H B<O B<C A<L I<B F<L C<L A<C N<O A<B F<C K<J C<G O<E I<O D<E I<N F<N M<J H<L N<D 15 60 B<M M<H N<G N<E I<D B<D A<J O<D D<J F<E I<L F<B I<C C<E I<K I<J A<E B<L G<J A<G N<H H<J K<N K<E F<J C<D K<M G<L F<H M<L A<K B<K E<L B<H F<D M<E M<G N<L O<J D<H O<B B<C A<L I<B F<L C<L A<C N<O A<B F<C K<J C<G O<E I<O D<E I<N F<N M<J H<L N<D 26 325 J<I L<P K<S M<X K<E H<W Z<S G<R F<R A<Y V<D P<X P<W M<S R<A G<V C<H O<R A<S N<C V<Y A<I F<Z V<Q V<R H<I Q<T M<Q F<A J<X M<D C<Q D<E V<F B<T X<U D<U G<Y V<B B<J N<U K<Z P<S E<U O<Y M<Z C<I F<S G<P O<J C<S W<U Z<Y D<L H<T B<Q X<W D<I K<B R<L L<X S<Q K<F B<R C<L O<B Y<S F<Y X<T S<U C<W O<P B<Z V<U C<X H<U O<U V<W D<A O<X G<D P<A D<X E<T S<T C<T H<O J<Q K<H Z<Q Z<W I<T J<A Z<E F<L Q<U J<S N<H J<E B<D M<I K<R Z<X B<Y P<Y R<E F<O R<P C<A D<Y D<Z B<X M<A I<Q K<J J<Z O<W H<R L<Q M<F W<T F<X F<E A<W N<J K<O H<S F<B V<K O<A R<U M<W M<K E<W C<D N<S S<E Y<I G<N F<P N<P G<W M<B J<W M<J X<Q Y<Q Y<E P<Q S<W J<T Z<U I<U M<Y F<Q V<Z J<D C<J K<Q A<Q M<U S<I C<O Z<I H<B G<A P<T G<F X<E B<U O<I C<F O<L N<V F<T J<L D<T R<S N<E L<T M<N O<D K<X V<L G<B O<E R<Y G<I O<Z G<U Z<L R<T N<Q C<Y M<C K<I O<S H<E R<X R<W H<J G<K E<I C<U H<A L<E N<F V<X N<W M<P H<F F<I R<Z K<T N<Y D<W G<J N<I G<S M<L N<X F<U L<Y G<H G<E D<S C<B V<P V<A V<I G<L B<L W<Q T<U N<D V<T P<I B<I N<Z P<E K<C E<Q K<D N<K B<E V<H G<T B<P V<J D<Q L<S M<T M<R K<A P<U N<A Z<A L<I V<E H<L K<Y A<T J<P C<R K<W M<H B<W N<T C<P G<Z R<D H<P Z<T X<S H<D G<O N<R L<W F<D H<Q R<I V<C V<O N<O L<U Z<P N<L C<E O<Q H<X F<J G<C D<P A<U A<E M<E J<Y I<W G<X L<A B<S N<B H<Y C<Z B<A Y<U X<A K<L Y<T R<J H<Z R<Q Y<W V<S X<Y G<Q K<U G<M M<V X<I J<U K<P M<O F<W O<T 26 26 A<B B<C C<D D<E E<F F<G G<H H<I I<J J<K K<L L<M M<N N<O O<P P<Q Q<R R<S S<T T<U U<V V<W W<X X<Y Y<Z Z<A 5 10 D<E A<D B<D B<C C<E D<C B<A A<C A<E B<E 20 158 I<L F<R I<C N<B C<K R<O E<D D<K F<S A<C J<E H<A N<D N<T H<I A<T M<S T<O P<Q G<J B<L N<I A<R T<S M<J B<J G<P N<E B<D N<F K<Q B<E E<O M<P M<F A<F H<S G<D P<J A<Q T<F G<F T<R L<Q A<J G<I H<O C<D P<L H<T T<E D<Q J<O A<M F<E E<K E<Q P<T C<E M<B T<J G<E N<K I<P M<Q H<M G<L I<J P<S A<K F<L T<L G<T I<Q B<O H<N M<G J<R C<B N<O T<D A<D L<S I<K R<Q M<E B<R O<Q R<D I<T T<Q I<D O<D N<Q A<S M<K H<G G<C H<E B<Q H<B G<S I<S I<R J<Q A<L F<Q J<D C<J H<L A<P F<K L<E I<O N<P E<S A<I C<R N<L T<B H<K R<K A<G C<Q J<K C<T P<B H<F O<K R<L O<S G<O M<I K<S F<O G<R B<S P<E T<K G<B A<O I<B P<C N<M J<F H<R F<D P<D H<P G<Q P<R L<K H<Q S<Q H<D C<O N<S N<A 10 40 E<J C<A G<J C<H G<I A<I D<I D<A G<E F<I A<J D<H E<B A<B D<E E<I D<C C<G F<A F<H D<B I<J I<B F<C J<B D<F G<H A<H I<H A<E E<H F<J H<B G<A G<F D<G F<E F<B C<B C<I 20 70 K<Q P<L I<C O<L I<M B<Q G<R J<E O<E J<C J<N H<T A<D G<B I<O S<K H<F J<L Q<C G<K J<B O<D P<K T<L E<D T<R R<L H<B F<L I<Q E<R P<M S<R T<C G<Q I<N G<C I<E R<N A<Q Q<M B<K A<R Q<R P<B E<N D<Q K<D S<F B<C B<T O<J S<M B<F R<M S<I S<T I<F H<D A<E P<T E<Q C<R K<C S<H B<L H<P E<F A<N O<B 5 10 D<C B<E B<D E<C A<E D<E A<B A<D A<C B<C 10 20 D<J C<A A<I J<G F<H F<J E<G F<D E<H C<J C<H E<J C<B D<G E<D F<G F<E A<H A<D J<H 6 11 A<B C<F B<F D<B B<E C<D A<F C<E F<E D<E A<C 9 23 I<A C<D B<D G<B F<D C<G I<F H<A C<E I<H B<A C<B I<E G<D H<C I<C D<E I<G B<F I<D H<G H<D C<F 20 34 J<C L<A S<D P<I R<I T<E L<O T<C O<C D<O S<I I<D B<G F<M T<M B<C H<M F<P Q<I F<O Q<J R<M E<M S<N B<N P<C L<E H<I D<C R<S Q<N P<E I<T E<D 20 190 B<E C<M N<S N<R O<K M<J B<J F<B G<B R<O Q<T Q<G D<G M<F C<T H<E D<B Q<F S<K A<P H<O H<S H<I P<S F<E F<T M<O A<O A<J R<K D<K H<N M<K Q<N P<E S<O P<O F<J N<D F<S C<D D<O A<S C<B Q<J F<P M<G R<J N<O L<I I<K B<O J<E C<J H<T Q<A Q<S L<B K<T O<T A<G H<G C<R P<B H<Q C<E A<E I<J R<F M<D H<D N<T C<O I<T D<R C<K H<P C<I C<P N<A R<B H<M R<I C<Q I<E Q<I Q<D C<S D<L N<B Q<K C<G P<J C<A J<T Q<L D<P R<G S<T H<K I<O D<E I<B P<K K<E N<G C<F M<T S<B A<K S<E A<F A<T P<G R<E D<I F<K I<S G<J H<F G<S L<F P<I M<L G<I N<P B<T L<P J<K C<H B<K A<I G<E G<T N<M M<B H<R D<J M<E F<G Q<M D<S H<B N<J Q<E G<O C<N H<A P<T Q<B L<S R<S N<L L<G Q<R F<O A<R L<E Q<P E<T M<R M<S L<O A<L R<P H<J L<K M<P A<M L<T R<T L<R S<J N<E F<I A<D D<F Q<O J<O O<E C<L A<B N<K N<F G<K D<T N<I H<L M<I L<J 0 0 ************************** ans Sorted sequence determined after 6 relations: DCAB. Sorted sequence determined after 29 relations: CFDAEBHGJI. Sorted sequence cannot be determined. Inconsistency found after 48 relations. Sorted sequence determined after 318 relations: GMNVKCHFOBRJDZLPXAYSEIWQTU. Sorted sequence determined after 25 relations: ABCDEFGHIJKLMNOPQRSTUVWXYZ. Sorted sequence determined after 7 relations: BADCE. Sorted sequence determined after 158 relations: HNAMGIPCTBJFRLEODKSQ. Inconsistency found after 35 relations. Sorted sequence cannot be determined. Sorted sequence determined after 7 relations: ABDEC. Sorted sequence cannot be determined. Sorted sequence determined after 11 relations: ACDBFE. Sorted sequence cannot be determined. Sorted sequence cannot be determined. Sorted sequence determined after 179 relations: CHQNAMDLRFPGISBJOKET.