POJ 1094 C++:Sorting It All Out
2017-01-03 12:43
295 查看
思路:
拓扑排序的思想,比较麻烦的一点是没输入一行关系就需要调用函数判断一次,每次找到入度为0的点,如果没有这样的点,那么说明存在环,如果有多个,无法判断关系但是还可能是存在环,找到入度为0的一个点之后,删除这个点和它所连接的边,注意:每次只能删除一个点,如果一次删除多个点,那么flag可能一直为0,无法判断flag=3的情况。反例:A<B A<C,#include <stdio.h> #include <iostream> #include <queue> #include <cstring> using namespace std; int m,n; int a[30][30]; queue<int> res; int judge(){ queue<int> re; int in[30]={0}; int aa[30][30]; memcpy(aa,a,sizeof(a)); int i,k,j; for(i=0;i<m;i++){ for(k=0;k<m;k++){ if(aa[i][k]==1){ in[k]++; } } } int flag=0; for(k=0;k<m;){ int count=0; for(i=0;i<m;i++){ if(in[i]==0)count++; } if(count==0)return 2; if(count>1)flag=3; for(i=0;i<m;i++){ if(in[i]==0){ k++; re.push(i); for(j=0;j<m;j++){ if(aa[i][j]){ aa[i][j]=0; in[j]--; } } in[i]=-1; break; } } } if(flag!=3){ res=re; return 1; } else return 3; } int main(){ while(cin>>m>>n){ if(m==0&&n==0)break; memset(a,0,sizeof(a)); int i,j,flag=0; char r,l; for(i=0;i<n;i++){ cin>>r>>l>>l; a[r-'A'][l-'A']=1; if(flag==1||flag==2)continue; flag=judge(); if(flag==1){ cout<<"Sorted sequence determined after "<<i+1<<" relations: "; while(!res.empty()){ int t=res.front(); res.pop(); cout<<(char)('A'+t); } cout<<"."<<endl; } if(flag==2)cout<<"Inconsistency found after "<<i+1<<" relations."<<endl; } if(flag==3)cout<<"Sorted sequence cannot be determined."<<endl; } return 0; }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C++的template模板中class与typename关键字的区别分析
- C与C++之间相互调用实例方法讲解