题目链接:http://poj.org/problem?id=1094
解题思路:
思路来源于网络。
唉,说到底对于图论的理解还是太浅了。
A<B可以看成A-->B,这样就不难把问题转换成一个拓扑排序了。把每一个不等式看成一条边,逐一往图中加边,每加入一条边检查一次。
1、建一个队列,像 bfs 那样,让所有入度为 0 的点入队。对于每一个入度为 0 的点,与它相连的所有点的入度全部 -1,然后继续让所有入度为 0 的未访问过的点入队;
2、任何时刻,一旦发现队列中有多个点,就说明直到目前为止,仍然没有唯一解;
3、最精彩的一点!在所有元素都出队以后,计算遍历过的所有元素的总数量p,一旦发现 p<n ,就说明这个有向图有环!仔细想想:对于形成环的点来说,它们的入度是不可能为0的,所以,如果图中有环,那么环中的点就不会被遍历到,那么我们遍历到的元素总数量就会小于n。在下拜服!
其他的还有一些细节,请看代码注释。
AC代码:
1 #include <cstdio> 2 #include <vector> 3 using namespace std; 4 5 vector<int> out[30]; 6 int in[30],tin[30]; 7 int n,m; 8 char ans[10000]; 9 int topu(){ 10 int ret=1; 11 int que[10000]; 12 int head=0,ending=0; 13 for(int i=0;i<n;i++){ 14 tin[i]=in[i]; //用tin[]暂时代替in[] 15 if(tin[i]==0){ 16 que[ending]=i; 17 ending++; 18 } 19 } 20 int p=0; 21 while(ending>head){ 22 if(ending>head+1) ret=0; //0代表暂时无唯一解 23 ans[p++]=que[head]+'A'; 24 for(int i=0;i<out[que[head]].size();i++){ 25 tin[out[que[head]][i]]--; 26 if(tin[out[que[head]][i]]==0){ 27 que[ending]=out[que[head]][i]; 28 ending++; 29 } 30 } 31 head++; 32 } 33 ans[p]='