拓扑排序模板--hdu2647
来源:互联网 发布:c 编程游戏写法 编辑:程序博客网 时间:2024/06/15 18:52
模板:
#include <iostream>#include <vector>#include <queue>#include <cstdio>#include <cstring>using namespace std;const int maxn = 1005; //最大边数int n; //点数vector<int> edge[maxn]; //邻接表queue<int> q; //维护一个入度为0的集合int indegree[maxn]; //记录每个顶点的入度void init(){ for(int i=0; i<n; i++) edge[i].clear(); memset(indegree, 0, sizeof(indegree));}void addedge(int from, int to){ edge[from].push_back(to); indegree[to]++;}bool topological_sort(){ for(int i=0; i<n; i++) if(indegree[i] == 0) q.push(i); //将所有入度为0的顶点入队 int cnt = 0; //记录当前已经输出的顶点数 while(!q.empty()) { int v = q.front(); q.pop(); cout << v << " "; //输出该顶点 cnt++; for(unsigned int i=0; i<edge[v].size(); i++) { int to = edge[v][i]; // 将所有v指向的顶点的入度减1,并将入度减为0的顶点入栈 indegree[to]--; if(!indegree[to]) q.push(to); } } if(cnt < n) return false; //有回路 else return true;}int main(){ init(); scanf("%d",&n); for(int i=0; i<n; i++) { int a,b; scanf("%d%d",&a,&b); addedge(a,b); } if(!topological_sort()) cout << "-1" << endl; return 0;}/*65 25 04 04 12 33 1*/
hdu2647题意:
有n个人,m个关系,a,b代表a应得的工资比b多,最低工资888,,要让所有人满意,求老板最少给多少工资。不可能完成输出-1。
/*By : ZHangFY*/#include <iostream>#include <vector>#include <queue>#include <cstdio>#include <cstring>using namespace std;const int maxn = 20005; //最大边数int n; //点数vector<int> edge[maxn]; //邻接表queue<int> q; //维护一个入度为0的集合int indegree[maxn]; //记录每个顶点的入度int reward[maxn]; //记录每个点应得的钱void init(){ for(int i=0; i<n; i++) edge[i].clear(); memset(indegree, 0, sizeof(indegree)); memset(reward, 0, sizeof(reward));}void addedge(int from, int to){ edge[from].push_back(to); indegree[to]++;}void topological_sort(){ for(int i=0; i<n; i++) if(indegree[i] == 0) q.push(i); int money = 888; int cnt = 0; while(!q.empty()) { while(!q.empty()) { int v = q.front(); q.pop(); reward[v] = money; cnt++; for(unsigned int j=0; j<edge[v].size(); j++) indegree[ edge[v][j] ]--; } money++; for(int i=0; i<n; i++) { if(indegree[i] == 0 && reward[i] == 0) q.push(i); } } if(cnt == n) { long long ans = 0; for(int i=0; i<n; i++) ans += reward[i]; cout << ans << endl; } else cout << "-1" << endl;}int main(){ int m; while(scanf("%d%d",&n,&m) != EOF) { init(); for(int i=0; i<m; i++) { int a,b; scanf("%d%d",&a,&b); addedge(b-1,a-1); //注意这里 } topological_sort(); } return 0;}
阅读全文
0 0
- 拓扑排序模板--hdu2647
- 拓扑排序hdu2647
- hdu2647 Reward (拓扑排序)
- hdu2647 拓扑排序
- HDU2647 Reward 【拓扑排序】
- hdu2647 - Reward (拓扑排序)
- HDU2647 Reward 【拓扑排序】
- HDU2647 Reward 拓扑排序
- hdu2647(拓扑排序)
- hdu2647 Reward (拓扑排序)
- Hdu2647【拓扑排序】
- hdu2647 Reward--拓扑排序
- HDU2647:Reward(拓扑排序)
- hdu2647 Reward 拓扑排序
- hdu2647(拓扑排序)
- HDU2647 Reward(拓扑排序)
- hdu2647 Reward【拓扑排序】
- 拓扑排序(1)--hdu2647(拓扑排序邻接表模板 应用判断是否存在环)
- bzoj2744 [HEOI2012]朋友圈 ( 二分图最大团转补图最大独立集+时间戳优化+匈牙利算法)
- 计蒜客 17119 Trig Function(2017 ACM-ICPC 亚洲区(西安赛区)网络赛 F)
- 最新cygwin下使用zsh
- python中使用多进程和单进程分别拷贝大量文件效率对比
- Android NDK 编程常见错误收集
- 拓扑排序模板--hdu2647
- GeekBand笔记-《C++设计模式》第二周
- c++普通继承、虚继承、虚函数对sizeof的影响
- [HDU]1530 Maximum Clique 最大团问题[模板]
- (网易2018校招笔试)[编程题] 字符串碎片
- android 性能调优
- Java文件操作
- vin码识别车架号识别介绍
- 图像处理中的神奇的卷积核