Educational Codeforces Round 25 E. Minimal Labelshdu1258
这两道题都需要用到拓扑排序,所以先介绍一下什么叫做拓扑排序。
这里说一下我是怎么理解的,拓扑排序实在DAG中进行的,根据图中的有向边的方向决定大小关系,具体可以下面的题目中理解其含义
Educational Codeforces Round 25 E. Minimal Labels
题目链接:http://codeforces.com/contest/825/problem/E
题意:给你一个有向无环图(DAG),有n个顶点,m条边,顶点的序号分别是1-n,现在给你1-n的数对n个顶点进行赋值,赋值有一定的要求让如果有一条边是x->y,那么x的权值小于y,最后,如果有多种赋值方式输出字典序最小的方式,这个题的图可以是由几个连通块组成。
一开始不会做,后来听说是拓扑排序裸题,所以就去学了一下,还是很简单的,关键在于这道题需要反向建图,直接上代码
//Author: xiaowuga #include <bits/stdc++.h> #define maxx INT_MAX #define minn INT_MIN #define inf 0x3f3f3f3f const long long N=200000+10; using namespace std; typedef long long LL; vector<int>q[N]; priority_queue<int>p;//优先队列,用来维护字典序 int main() {int n,m;scanf("%d%d",&n,&m);int in[N]={0};for(int i=0;i<m;i++){int x,y;scanf("%d%d",&x,&y);q[y].push_back(x);//反向建图in[x]++;//记录每个点出度}for(int i=1;i<=n;i++) if(in[i]==0) p.push(i);//在剪边前,把出度为0(叶子节点)的点压入堆int now=n,ans[N]; //由于优先队列是大顶堆,每次回选出当前堆里最大的元素,出来赋值,保证了字典序最小while(!p.empty()){int t=p.top();p.pop();//ans[t]=now--;for(int i=0;i<q[t].size();i++){if(--in[q[t][i]]==0) p.push(q[t][i]);//剪边,将剪完边以后出度为0的顶点压入堆}}for(int i=1;i<=n;i++){printf("%d ",ans[i]);}cout<<endl;return 0; }
这道题的关键是在于需要反向建图,原因是它需要一个点所有边的弧尾都标完号才能确定这个点的标号,意思就是每个点的后续节点都赋值了以后我才能对这个点赋值(因为这个点的赋值要比他的所有后续节点要小)。所以后续节点决定他前序节点的赋值,所以我们通过反向建图,从后往前拓扑排序,用优先队列维护字典序,并一路赋值,就可以AC了。
HDU1285
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1285
题意:中文问题,懒的解释,自己看吧,题目已经写得很清楚了。与上一道题不同的是这道题正向建图,直接上代码。
//Author: xiaowuga #include <bits/stdc++.h> #define maxx INT_MAX #define minn INT_MIN #define inf 0x3f3f3f3f const long long N=517; using namespace std; typedef long long L; int p[N][N]; int in[N]; priority_queue<int,vector<int>,greater<int> > q; int main() {ios::sync_with_stdio(false);cin.tie(0);int n,m;while(cin>>n>>m){memset(p,0,sizeof(p));memset(in,0,sizeof(in));while(!q.empty()) q.pop(); for(int i=0;i<m;i++){int x,y;cin>>x>>y;if(p[x][y]==0){p[x][y]=1;in[y]++;//记录点的入度 }}for(int i=1;i<=n;i++) if(in[i]==0) q.push(i);//将入度为0的点压入堆int ct=1;while(!q.empty()){int t=q.top();q.pop();if(ct!=n){cout<<t<<" ";ct++;} else cout<<t<<endl;for(int i=1;i<=n;i++){if(p[t][i]==0) continue;if(--in[i]==0) q.push(i);//自树根到树叶的剪边 }}}return 0; }
这道题需要正向建图原因是
转载于:https://www.cnblogs.com/xiaowuga/p/7211412.html
Educational Codeforces Round 25 E. Minimal Labelshdu1258相关推荐
- Educational Codeforces Round 25 G. Tree Queries
题目链接:Educational Codeforces Round 25 G. Tree Queries 题意: 给你一棵树,一开始所有的点全是黑色,有两种操作. 1 x 将x这个点变为黑色,保证第一 ...
- Educational Codeforces Round 25
这一场是暑期的第一场,做了4个题,被HACK两个,都是很粗心的错误,手生的问题. [A]Binary Protocol 题意:给你一串字符串,只有0和1.用m个0将字符串分为m+1段,每段字符串中'1 ...
- Educational Codeforces Round 25 C. Multi-judge Solving
题目链接:http://codeforces.com/contest/825/problem/C C. Multi-judge Solving time limit per test 1 second ...
- Educational Codeforces Round 90 (Rated for Div. 2)(A, B, C, D, E)
Educational Codeforces Round 90 (Rated for Div. 2) Donut Shops 思路 分三种情况: a==c/ba == c / ba==c/b这个时候两 ...
- Educational Codeforces Round 24 E. Card Game Again(双指针)
题目链接:Educational Codeforces Round 24 E. Card Game Again 题意: 给你n个数和一个数k. 现在每次可以拿掉前x个数,后y个数,剩下的数的乘积要能被 ...
- Educational Codeforces Round 40千名记
人生第二场codeforces.然而遇上了Education场这种东西 Educational Codeforces Round 40 下午先在家里睡了波觉,起来离开场还有10分钟. 但是突然想起来还 ...
- Educational Codeforces Round 113 (Rated for Div. 2) ABCD 解题思路
Educational Codeforces Round 113 (Rated for Div. 2) 经典卡CCC秒DDD,可惜了 怪自己特判写错了吧,对式子找了半天问题结果根本不是式子的问题 A ...
- Educational Codeforces Round 112(Div.2) ABC题解
D题好像可以做一做,挖个坑以后做好了来填(doge Educational Codeforces Round 112(Div.2) 题目列表 1.A 2.B 3.C 1.A 原题链接 题目大意 有三种 ...
- Educational Codeforces Round 112 (Rated for Div. 2)-A. PizzaForces-题解
目录 Educational Codeforces Round 112 (Rated for Div. 2)-A. PizzaForces Problem Description Input Outp ...
最新文章
- MPB:中科院城环所杨军组-​​​基于DNA宏条形码的水体浮游细菌群落测序建库方法...
- php empty详解
- 斯坦福-随机图模型-week1.0_
- Skype for Business Server 2015-10-ADFS-2-配置
- jmeter+maven+jenkins自动化接口测试(下)
- C++vector的reserve和resize比原来的容量小
- 玄姐出品:想和兄弟、集美们聊聊“分布式CAP”中情侣的纠缠故事,真是剪不断 理还乱!...
- 4月份全球新注册39.2万辆电动汽车 榜首并非Model 3
- android o 编译及运行,【转】实践最有效的提高Android Studio运行、编译速度方案
- electron 里html不识别require_electron关于应用功能之旅(六)
- visa虚拟卡生成器_虚拟信用卡,额度6万!无需面签即可办理
- linux 交叉编译ffplay,交叉编译ffmpeg生成ffplay
- Android 使用listview实现树形结构
- amap和amapcrap使用
- 微信web端生成支付二维码
- 最美中国字|硬笔书法“崇”字这样写才好看,建议收藏!
- HBuilderX软件
- etf持仓如何影响现货金价?
- 网络信息安全:消息认证
- CSS基础--选择器定位
热门文章
- APP后端数据接口注意事项
- 春晓html代码,春晓
- mysql技术简介_MySQL数据类型介绍
- python基础分析_python基础--函数全解析(1)
- python lambda 判断_在Python的Filter中使用lambda函数时,为何达不到预期效果?
- 嵌入式Linux入门6:u-boot移植
- 使用cppcheck检测代码警告、错误
- 用户交互输入--mtd-utils代码一例
- 【Flink】Flink 如何在本地IDEA恢复检查点 不通过IDEA 不通过 flink run 方法
- 【java】java getOrDefault 方法的一个坑,容易导致OOM