题意是 给出你一个数N,(表示 从A 开始的N个大写字母) 以及这N字母 的M个关系 ,关系是 A<B 来表示。让你判断在某一次读入数据后,能否判断出
N个字母的大小顺序,能否出现 矛盾。共三种结果 。
思路: 每次读入后,拓扑排序。。 判断能否排好序或者出现矛盾。
只要在拓扑排序上稍加改动就行。。
一 。能否排好序:每次往队列添加一个数,在抛出一个,在添加一个 ,才能是拍好序的。。。 于是 每次往队列里添加是 用个变量 num 统计填入的个数。但队列抛出操作是 num 在变成 0。
二 。会不是出现矛盾。 队列只有出现了 入度为0 的点才会出队,如果有环 ,环上的点就不会出队了 。 一开始把所有的入度为0的点入队,拓扑排序后 ,如果有剩余就 有环了。
于是用一个 outsum 统计出队的数的个数。 但outsum< n 是就形成了环
三 。 不能确定 。如果到最后一组都不能确定。就输出不能确定了。
题意隐含这一个意思 : 只要能够排序了,就不再处理后边的数据。。。。。我就在这个地方一直wa 。。。不知道这一点 。。其实这样的话程序还好些点 。。
这个题由于数据小,用邻接矩阵做就行。。用邻接链表数据处理麻烦,比如连续出现了两次 A<B 的话 就会重复 ,我没想到什么好的方法判重。。
#include <iostream> #include <cstdio> #include <cstring> #include <queue> using namespace std; int n, m ; char input[4]; int adj[30][30];//eage int in_deg[30]; char answer [30];//存最终的排序结果 void init(){ memset(in_deg,0,sizeof(in_deg)); memset(adj,0,sizeof(adj)); } int topo(int in_deg[]){ answer[0]='\0'; int indeg[30]; for(int i = 0 ;i<29;i++){ indeg[i]=in_deg[i]; } queue <int >q;//用队列拓扑排序。。 int innum=0;//统计每次入队的数量 int outsum = 0 ; // 统计出队的总次数 bool sigle = true; // 判断是否单进单出 也就是判断能否排序 for(int i=1; i<=n;i++){ if(indeg[i]==0){ q.push(i); innum++; } } if(innum>1){ sigle =false; } innum = 0 ; int ch_idx=0; while(!q.empty()){ int node = q.front(); q.pop(); answer[ch_idx++]=(char)(node+'A'-1); outsum ++; int innum=0; for(int i= 1;i<=n;i++){ if(adj[node][i]==1){ indeg[i]--; if(indeg[i]==0){ q.push(i); innum++; } } } if(innum>1){ sigle =false ; } } if(outsum==n){ if(sigle) return 2; // 可以排序 return 1; // 不可排序 } return 0; //矛盾 } int main(){ while(true){ scanf("%d%d",&n,&m); if(n==0&&m==0){ break; } init(); bool con = false;// 如果已经排好序 或者矛盾 后边的数据就不处理了 但要读入 int ans = -1; answer[0]='\0'; for(int i=1;i<=m;i++){ scanf("%s",input); if(con){ continue; } int fir = input[0]-'A'+1; int sec = input[2]-'A'+1; if(!adj[fir][sec]){ adj[fir][sec]=1; // 边存入邻接矩阵中 in_deg[sec]++; } int num = topo(in_deg); if(num==0){ printf("Inconsistency found after %d relations.\n",i); con =true; } if(num ==2){ printf("Sorted sequence determined after %d relations: ",i); for(int j = 0 ; j< n ;j++){ printf("%c",answer[j]); } printf(".\n"); con =true; } if(i==m){ if(num == 1){ printf("Sorted sequence cannot be determined.\n"); } } } } return 0; }