poj 1094 拓扑排序+邻接表

题意:给出元素个数与元素之间的关系,判断3种情况,能写出序列,有冲突,与不确定。

数据:

Sample Input

4 6
A<B
A<C
B<C
C<D
B<D
A<B
3 2
A<B
B<A
26 1
A<Z
0 0

Sample Output

Sorted sequence determined after 4 relations: ABCD.
Inconsistency found after 2 relations.
Sorted sequence cannot be determined.

 

第一次做读错题。。。。英语是硬伤啊~~~

总结拓扑排序算法过程。

一般使用邻接表保存图。记录每个度的入度与出度。其他问题就没什么了。

这题要注意的是需要先判断是否有环,在判断是否能成功。

**此题要注意的是一旦给出的序列能成功,后面的关系就直接忽略,直接输出成功。

总结Toposrot:

建立邻接表或邻接矩阵:

输入时,对出入度进行操作。

排序时:

找到入度为零的位置;

循环其出度次,将与其相连的位置入度减一;

该位置加入队中;

 

代码:

#include<iostream> #include<fstream> #include<cstring> using namespace std; char G[26][26]; int dm[26];        //每一列的和,即每个字母的入度 int dn[26];        //每一行的和,即每个字母的出度 int m,n; char result[27];

int TopoSort() {     int index;      //起点     int r = 0;     int count;     bool sorted = true;     int dmt[26];     int dnt[26];     memcpy(dmt,dm,sizeof(dmt));     memcpy(dnt,dn,sizeof(dnt));     //找出入度为零的点     for(int j=0;j<n;j++)     {         count = 0;         for(int i=0;i<n;i++)         {             if(0 == dmt[i])             {                 index = i;                 count++;             }         }         if(0 == count)   //发现环路             return count;         if(count > 1)  sorted = false;                 //从index开始,将与其相邻的入度减一;         for(int i=0;i<dnt[index];i++)         {             dmt[G[index][i]-'A']--;         }         dmt[index] = -1;        //index入度为-1  除去         result[r++] = index + 'A';     }     result[r] = 0;     if(sorted)         return 1;    //序**定     else         return 2;    //序列不确定 } int main() {     int i,j,k;     char str[4];     //freopen("input.txt","r+",stdin);     cin>>n>>m;     while(n&&m)     {         k = 0;         int found = 0;      //可以完全确定序列         int incons = 0;     //发现冲突,即环路         memset(dm,0,sizeof(dm));            memset(dn,0,sizeof(dn));         memset(G,0,sizeof(G));         for(i=0;i<m;i++)         {             cin>>str;             if(!found && !incons)             {                 for(j=0;j<dn[str[0]-'A'];j++)     //确定j为邻接表赋值 --指向出度                 {                     if(G[str[0]-'A'][j] == str[2])      //当邻接表已有这个关系,则不操作                         break;                 }                 if(j == dn[str[0]-'A'])                                  {                     G[str[0]-'A'][j] = str[2];        //邻接表操作                     dm[str[2]-'A'] ++;                                    dn[str[0]-'A'] ++;                                }                 int res = TopoSort();                                               if(1 == res)  //序列已确定                 {                     found = i+1;                 }                 else if(0 == res)   //发现冲突                 {                     incons = i+1;                 }             }         }         if(found)         {             cout<<"Sorted sequence determined after "<<found<<" relations: "<<result<<"."<<endl;         }         else if(incons)         {             cout<<"Inconsistency found after "<<incons<<" relations."<<endl;         }         else         {             cout<<"Sorted sequence cannot be determined."<<endl;         }         cin>>n>>m;     }

    return 0; }


 

posted @ 2012-12-03 17:41  amourjun  阅读(178)  评论(0编辑  收藏  举报