SGU 230 拓扑排序
来源:互联网 发布:ubuntu chromium 编辑:程序博客网 时间:2024/05/01 08:11
利用拓扑排序,判断环即可。
#include <stdio.h>#include <iostream>#include <queue>#include <algorithm>#include <map>#include <vector>#include <cmath>#include <string.h>#include <stdlib.h>#include <time.h>#include <fstream>#include <set>#include <stack>#include <list>using namespace std;#define READ freopen("acm.in","r",stdin)#define WRITE freopen("acm.out","w",stdout)#define ll long long#define ull unsigned long long #define uint unsigned int#define PII pair<int,int>#define PDD pair<double,double>#define fst first#define sec second#define MS(x,d) memset(x,d,sizeof(x))#define INF 0x3f3f3f3f#define ALL(x) x.begin(),x.end()#define PB push_back#define MOD 99991#define MAX 1000000int n,m;vector<int> G[20000];vector<int> topo;bool judge(){ int du[20000]; int cnt=0; queue<int> q; MS(du,0); for(int i=1;i<=n;i++) for(int j=0;j<G[i].size();j++) du[G[i][j]]++; for(int i=1;i<=n;i++) if(!du[i]) q.push(i),topo.push_back(i); cnt+=q.size(); while(!q.empty()) { int u=q.front(); q.pop(); for(int i=0;i<G[u].size();i++) { int v=G[u][i]; du[v]--; if(!du[v]) q.push(v),cnt++,topo.push_back(v); } } return cnt==n;}int main(){ READ; scanf("%d%d",&n,&m); for(int i=0;i<m;i++) { int f,t; scanf("%d%d",&f,&t); G[f].push_back(t); } int ans[20000]; if(judge()) { for(int i=1;i<=n;i++) ans[topo[i-1]]=i; for(int i=1;i<=n;i++) { cout<<ans[i];//<<" "; if(i!=n) cout<<" "; } cout<<endl; } else puts("No solution"); return 0;}
0 0
- SGU 230 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 【拓扑排序】
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 笔试 - 高德软件有限公司python试题 及 答案
- Linux 防火墙 iptables dport和sport
- GXL问题解答之一
- C++判断只能输数字的问题
- 网络驱动移植之解析Linux网络驱动的基本框架
- SGU 230 拓扑排序
- 导出数据到Excel方法总结
- 排序算法 简单选择排序
- Class create, device create, device create file
- 类设计中的重载运算符和拷贝构造函数
- cocos2dx3.0移植到android环境遇到的问题
- favicon.ico
- 3D Math Primer for Game Programmers (Coordinate Systems)
- 设置SVN文件忽略表(VS2005、VS2008等开发环境下)