这两道题都需要用到拓扑排序,所以先介绍一下什么叫做拓扑排序。

这里说一下我是怎么理解的,拓扑排序实在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相关推荐

  1. Educational Codeforces Round 25 G. Tree Queries

    题目链接:Educational Codeforces Round 25 G. Tree Queries 题意: 给你一棵树,一开始所有的点全是黑色,有两种操作. 1 x 将x这个点变为黑色,保证第一 ...

  2. Educational Codeforces Round 25

    这一场是暑期的第一场,做了4个题,被HACK两个,都是很粗心的错误,手生的问题. [A]Binary Protocol 题意:给你一串字符串,只有0和1.用m个0将字符串分为m+1段,每段字符串中'1 ...

  3. 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 ...

  4. 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这个时候两 ...

  5. Educational Codeforces Round 24 E. Card Game Again(双指针)

    题目链接:Educational Codeforces Round 24 E. Card Game Again 题意: 给你n个数和一个数k. 现在每次可以拿掉前x个数,后y个数,剩下的数的乘积要能被 ...

  6. Educational Codeforces Round 40千名记

    人生第二场codeforces.然而遇上了Education场这种东西 Educational Codeforces Round 40 下午先在家里睡了波觉,起来离开场还有10分钟. 但是突然想起来还 ...

  7. Educational Codeforces Round 113 (Rated for Div. 2) ABCD 解题思路

    Educational Codeforces Round 113 (Rated for Div. 2) 经典卡CCC秒DDD,可惜了 怪自己特判写错了吧,对式子找了半天问题结果根本不是式子的问题 A ...

  8. Educational Codeforces Round 112(Div.2) ABC题解

    D题好像可以做一做,挖个坑以后做好了来填(doge Educational Codeforces Round 112(Div.2) 题目列表 1.A 2.B 3.C 1.A 原题链接 题目大意 有三种 ...

  9. Educational Codeforces Round 112 (Rated for Div. 2)-A. PizzaForces-题解

    目录 Educational Codeforces Round 112 (Rated for Div. 2)-A. PizzaForces Problem Description Input Outp ...

最新文章

  1. MPB:中科院城环所杨军组-​​​基于DNA宏条形码的水体浮游细菌群落测序建库方法...
  2. php empty详解
  3. 斯坦福-随机图模型-week1.0_
  4. Skype for Business Server 2015-10-ADFS-2-配置
  5. jmeter+maven+jenkins自动化接口测试(下)
  6. C++vector的reserve和resize比原来的容量小
  7. 玄姐出品:想和兄弟、集美们聊聊“分布式CAP”中情侣的纠缠故事,真是剪不断 理还乱!...
  8. 4月份全球新注册39.2万辆电动汽车 榜首并非Model 3
  9. android o 编译及运行,【转】实践最有效的提高Android Studio运行、编译速度方案
  10. electron 里html不识别require_electron关于应用功能之旅(六)
  11. visa虚拟卡生成器_虚拟信用卡,额度6万!无需面签即可办理
  12. linux 交叉编译ffplay,交叉编译ffmpeg生成ffplay
  13. Android 使用listview实现树形结构
  14. amap和amapcrap使用
  15. 微信web端生成支付二维码
  16. 最美中国字|硬笔书法“崇”字这样写才好看,建议收藏!
  17. HBuilderX软件
  18. etf持仓如何影响现货金价?
  19. 网络信息安全:消息认证
  20. CSS基础--选择器定位

热门文章

  1. APP后端数据接口注意事项
  2. 春晓html代码,春晓
  3. mysql技术简介_MySQL数据类型介绍
  4. python基础分析_python基础--函数全解析(1)
  5. python lambda 判断_在Python的Filter中使用lambda函数时,为何达不到预期效果?
  6. 嵌入式Linux入门6:u-boot移植
  7. 使用cppcheck检测代码警告、错误
  8. 用户交互输入--mtd-utils代码一例
  9. 【Flink】Flink 如何在本地IDEA恢复检查点 不通过IDEA 不通过 flink run 方法
  10. 【java】java getOrDefault 方法的一个坑,容易导致OOM