拓扑排序
来源:互联网 发布:tensorflow车牌识别 编辑:程序博客网 时间:2024/06/18 05:09
先判断能否进行拓扑排序,本质就是检查是否存在环
统计入度的情况,将入度为0的,加入队列中。
#include<iostream>#include<cstdio>#include<vector>#include<queue>using namespace std;int main(){ int N,M,in_degree[100],a,b,nodecount; vector<int> edge[100*99/2]; queue<int> Q; while(cin>>N>>M&&N){ //初始化 for(int m=0;m<N;m++){ in_degree[m]=0; edge[m].clear(); } while(!Q.empty()) Q.pop(); nodecount=0; //读入数据 for(int i=0;i<M;i++){ cin>>a>>b; edge[a].push_back(b); in_degree[b]++; } for(int j=0;j<N;j++){ if(in_degree[j]==0) Q.push(j); } while(!Q.empty()){ int node = Q.front(); Q.pop(); nodecount++; for(int k=0;k<edge[node].size();k++){ in_degree[edge[node][k]]--; if(in_degree[edge[node][k]]==0){ Q.push(edge[node][k]); } } } if(nodecount==N) printf("YES\n"); else printf("NO\n"); } return 0;}
依次删除入度为0的节点
如果要排序,并且按照某顺序,可以采用优先队列
另外一种变体
产生冠军
#include<iostream>#include<cstdio>#include<vector>#include<queue>#include<algorithm>#include<set>#include<string>#include<map>using namespace std;int main(){ int n,sum; string p1,p2; map<string ,vector<string > > edge_map; map<string,int> indegree; while(cin>>n&&n){ int nodecount = 0; edge_map.clear(); indegree.clear(); for(int i=0;i<n;i++){ cin>>p1>>p2; edge_map[p1].push_back(p2); if(indegree.find(p1)==indegree.end()) indegree[p1]=0; if(indegree.find(p2)==indegree.end()) indegree[p2]=0; indegree[p2]++; } map<string,int>::iterator it; for(it=indegree.begin();it!=indegree.end();it++){ if(it->second==0){ nodecount ++; } } if(nodecount==1) printf("Yes\n"); else printf("No\n"); } return 0;}
以上代码需要注意的是map的查找和遍历。
阅读全文
0 0
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 【拓扑排序】
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 芒果iOS开发之NSComparisonResult比较结果
- 消息机制之文件下载与断点续传,多线程下载
- Spark大神班--涛哥星哥联合BAT大神倾情打造
- oracle常用语句整理
- iOS学习笔记之GCD详解
- 拓扑排序
- Codeforces 814C An impassioned circulation of affection (dp)
- WIN7系统没有USB驱动和以太网驱动如何操作
- Cocos2d-x 中加载骨骼动画资源
- 登录拦截
- Android 属性动画
- JUnit4 中@AfterClass @BeforeClass @after @before的区别对比
- java经典算法-猴子分桃
- 数据结构——图的存储 邻接表