HDU 2647 拓扑排序
题意:每个人的工资至少888,然后有m个条件,前者比后者要多。求最少工资。
分析:
最开始的开邻接矩阵的肯定超时,如果dfs,会出现由于刚开始不是从入度为0的点出发,后期修改不了。比较麻烦。
正确方式是,用队列实现,不需要像普通队列一样,用vis数组标记,而是根据入度是否为0的标准加入队列。
1 /* 2 #include <bits/stdc++.h> 3 4 using namespace std; 5 6 const int maxn = 10000+5; 7 int n,m; 8 9 vector<int> G[maxn]; 10 11 int c[maxn]; 12 int d[maxn]; 13 bool dfs(int u,int k) { 14 c[u] = -1; 15 //d[u] = k; 16 for(int i=0;i<G[u].size();i++) { 17 int v = G[u][i]; 18 19 if(c[v]<0) return false; 20 else if(!c[v]&&!dfs(v,k+1)) return false; 21 22 } 23 24 c[u] = 1; 25 return true; 26 27 } 28 29 bool toposort() { 30 memset(c,0,sizeof(c)); 31 for(int u=1;u<=n;u++) { 32 if(!c[u]) 33 if(!dfs(u,0)) 34 return false; 35 } 36 return true; 37 } 38 39 int main() 40 { 41 freopen("in.txt","r",stdin); 42 while(scanf("%d%d",&n,&m)!=EOF) { 43 44 for(int i=0;i<=n;i++) 45 G[i].clear(); 46 47 for(int i=0;i<m;i++) { 48 int u,v; 49 scanf("%d%d",&u,&v); 50 G[v].push_back(u); 51 } 52 53 memset(d,0,sizeof(d)); 54 55 int sum = 0; 56 57 58 if(toposort()) { 59 for(int i=1;i<=n;i++) { 60 sum+=d[i]; 61 } 62 printf("%d\n",888*n+sum); 63 } 64 else puts("-1"); 65 66 67 } 68 return 0; 69 } 70 */ 71 72 73 #include <bits/stdc++.h> 74 75 using namespace std; 76 77 const int maxn = 10000+10; 78 79 vector<int> G[maxn]; 80 int degree[maxn]; 81 82 83 int main() 84 { 85 //freopen("in.txt","r",stdin); 86 int n,m; 87 while(scanf("%d%d",&n,&m)!=EOF) { 88 89 for(int i=1;i<=n;i++) { 90 G[i].clear(); 91 } 92 memset(degree,0,sizeof(degree)); 93 94 for(int i=0;i<m;i++) { 95 int u,v; 96 scanf("%d%d",&u,&v); 97 G[v].push_back(u); 98 degree[u]++; 99 } 100 101 queue<pair<int,int> > Q; 102 103 int cnt = 0,ans = 0; 104 for(int i=1;i<=n;i++) { 105 if(!degree[i]) { 106 Q.push(make_pair(i,888)); 107 ans+=888; 108 cnt++; 109 } 110 } 111 112 while(!Q.empty()) { 113 pair<int,int> u = Q.front(); 114 Q.pop(); 115 116 for(int i=0;i<G[u.first].size();i++) { 117 int v = G[u.first][i]; 118 degree[v]--; 119 if(!degree[v]) { 120 Q.push(make_pair(v,u.second+1)); 121 ans += u.second + 1; 122 cnt++; 123 } 124 } 125 126 } 127 128 if(cnt==n) 129 printf("%d\n",ans); 130 else puts("-1"); 131 132 133 134 } 135 return 0; 136 }
View Code
转载于:https://www.cnblogs.com/TreeDream/p/7214404.html
HDU 2647 拓扑排序相关推荐
- HDU 4857 拓扑排序 优先队列
n个数,已经有大小关系,现给m个约束,规定a在b之前,剩下的数要尽可能往前移.输出序列 大小关系显然使用拓扑结构,关键在于n个数本身就有大小关系,那么考虑反向建图,优先选择值最大的入度为零的点,这样得 ...
- hdu 1811(拓扑排序+并查集)
解题思路: 拓扑排序的两个性质: ①如果一次入队入度为零的点大于1则说明拓扑排序序列不唯一 ②如果排序的总个数小于给定的个数,则说明存在回路 可以先把"="的两个数用并查集放在一个 ...
- HDU 5811 (拓扑排序 LIS)
题目链接:点击这里 题意:给定n个人之间的强壮关系(没有传递性),分成两个组,首先判断每一组是否能够通过某种排列使得前面的人都比后面的人强壮.如果可以,最多能从2组中选几个人到1组使得1组通过排列仍然 ...
- HDU 2647 Reward (拓扑排序)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2647 题意是给你n点m条有向边,叶子点(出度为0)上的值为888,父亲点为888+1,依次计算... ...
- HDU 2647 Reward 拓扑排序
http://acm.hdu.edu.cn/showproblem.php?pid=2647 题意: 输入N和M代表N个人和M组数据,M组数据中的A和B代表A的工资要比B的工资高,底薪是(888元), ...
- hdu 5438 Ponds 拓扑排序
Ponds Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/contests/contest_showproblem ...
- HDU 3342 Legal or Not(拓扑排序判断成环)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3342 题目大意:n个点,m条有向边,让你判断是否有环. 解题思路:裸题,用dfs版的拓扑排序直接套用即 ...
- HDU 1811 Rank of Tetris(并查集按秩合并+拓扑排序)
Rank of Tetris Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- hdu 4857 逃生 拓扑排序
逃生 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=4857 Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只 ...
最新文章
- 大数据中心周边辐射大吗_PETCT有辐射,PETCT对陪同人员的影响大吗?
- vue 打印出git提交信息_规范git项目提交并自动生成项目commit log
- Prepared statements(mysqli pdo)
- Sharepoint学习笔记—DebugTroubleShooting--不同调试对象的Attach方式
- jsp九大内置对象与servlet中java对象
- Rayeager PX2开发板 评测系列之初见
- Java的世界如此美妙
- VIIRS-NPP夜间灯光遥感数据下载和预处理
- ryzen linux mac,AMD Ryzen平台全新macOS10.13.3简洁安装黑苹果镜像
- python分层抽样_抽样方法—分层抽样
- 像素坐标转换实际坐标python_像素坐标转世界坐标的计算
- 【数据分析】⚠️走进数据分析 2⚠️ 爬虫简介
- 2017“硅谷技划”日记之五:从组织者眼光看Google IO大会
- 毕业设计 基于单片机的万能红外遥控器 - 物联网 嵌入式
- 高阶组件HOC - 小试牛刀
- C 语言画一颗圣诞树
- 实现文字后面加一条横线的效果
- web前端之幻灯片(二)--自动播放
- 【AI应用】NVIDIA GeForce RTX 2060的详情参数
- html的毕业设计步骤和方法,毕业论文写作的8大步骤