目录

一、【HNOI]2015菜肴制作

二、洛谷1113杂物

代码一:

代码二:

三、最大食物链计数【洛谷4017】


DAG:有向无环图

图的建立很重要

一、【HNOI]2015菜肴制作

传送门1

思路&技巧倒过来看,因为要让尽可能小的数字先选,也就是大的后选,整个图倒着建,先选最大的、入度为0的点输出时再倒过来

#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
const int M=1e5+6;
int ct,T,n,m,head[M],inc[M],ans[M];//inc[]入度
struct ED{int t,next;
}e[M];
void addedge(int u,int v){e[++ct].t=v;e[ct].next=head[u];head[u]=ct;
}
priority_queue<int> q;
bool tuopu(){//while(!q.empty())q.pop();//可以不要,不会出现不为空的情况 for(int i=1;i<=n;i++)if(!inc[i])q.push(i);int num=0;while(!q.empty()){int x=ans[++num]=q.top();q.pop();for(int i=head[x];~i;i=e[i].next){int y=e[i].t;inc[y]--;if(!inc[y])q.push(y);}}if(num<n)return 0;else return 1;
}
int main(){ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);cin >>T;while(T--){ct=0;cin >>n>>m;memset(head,-1,sizeof(head));memset(inc,0,sizeof(inc));for(int i=0,x,y;i<m;i++){cin >>x>>y;addedge(y,x);inc[x]++;}if(!tuopu())cout<<"Impossible!";else for(int i=n;i>0;i--)cout<<ans[i]<<' ';cout<<'\n';  }return 0;
}

二、洛谷1113杂物

传送门2

代码一:

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int M=1e4+6;
int n,len[M],vis[M],ans;
vector <int> link[M];
int dfs(int x){if(vis[x])return vis[x];//如果该结点被访问过,返回访问这个结点的最短时间 for(int i=0;i<link[x].size();i++)vis[x]=max(vis[x],dfs(link[x][i]));//找到所有连向这个点的边中最长的一条 vis[x]+=len[x];//加上这个结点的时间 return vis[x];
}
int main(){ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);cin >>n;for(int i=1,x,y;i<=n;i++){cin >>x>>len[i];while(cin>>y){if(!y)break;link[y].push_back(x);}}for(int i=1;i<=n;i++)ans=max(ans,dfs(i));cout <<ans;return 0;
}

不得不说有更妙的,短小精悍,抓住了题干的输入顺序的特点Orz_Orz。这是拓扑排序吗?其实,这些代码可以认为是广义上的拓扑排序,即实现了对结点访问顺序进行排序的功能,只是实现的方式为 dfs 而已。

代码二:

#include<iostream>
#include<algorithm>
using namespace std;
const int M=1e4+6;
int n,ans[M],ma;
int main(){ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);cin >>n;for(int i=1,w;i<=n;i++){cin >>i>>w;int tp=0,x;while(cin>>x&&x)tp=max(ans[x],tp);ans[i]=tp+w;ma=max(ans[i],ma);}cout<<ma;return 0;
}

三、最大食物链计数【洛谷4017】

传送门3

思路:咱就是说,先把题目意思看清楚咯qwq,为啥叫最“”食物链“计数”,可别想成是求最长食物链的长度喽。然后解释“最大食物链”是什么,首先起点一定是生产者,其次要“不被捕食”的消费者结尾。问题就转化为了:左端点入度为0,右端点出度为0的路径数。所以我们要记录点的入度和出度,每次擦除一个(入度为0的)点时把它积累的值加入它所指向的结点里头...后面就是一顿拓扑排序的常规操作(用一个队列实现)。

#include<iostream>
#include<queue>
#include<vector>
using namespace std;
const int M=5e3+6,mod=80112002;
int n,m,ind[M],oud[M],f[M],ans;
vector<int> v[M];
queue<int> q;
int main(){ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);cin>>n>>m;for(int i=0,x,y;i<m;i++){cin>>x>>y;oud[x]++,ind[y]++;v[x].push_back(y);}for(int i=1;i<=n;i++)if(!ind[i])f[i]=1,q.push(i);while(!q.empty()){int x=q.front();q.pop();int sz=v[x].size();for(int i=0;i<sz;i++){int y=v[x][i];ind[y]--;f[y]=(f[x]+f[y])%mod;if(!ind[y])q.push(y);}}for(int i=1;i<=n;i++)if(!oud[i])ans=(ans+f[i])%mod;cout<<ans;return 0;
}

拓扑排序三题(菜肴制作杂物最大食物链计数)相关推荐

  1. 数据结构-图论-拓扑排序模板题(hdu3342)(poj1270)(hdu4857)

    dfs与bfs的很直接的应用就是拓扑排序. 拓扑排序如果用数组来模拟链表进行操作,既解决了稀疏图的空间问题,又解决了用链表进行操作麻烦的问题 但是拓扑排序并不是数字大小之间的排序,而是某些事情之间的顺 ...

  2. 拓扑排序基础题——排序

    题目 由于公司在2013年的销售业务成绩优秀,公司总经理心情大好,决定给每位员工发奖金.公司决定以每个人本年在公司的贡献为标准来计算他们得到奖金的多少.于是总经理下令召开 m 方会谈.每位参加会谈的代 ...

  3. HDU 4857 逃生 拓扑排序好题 第一次做CLJ出的题

    逃生 Problem Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行. 现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必须在b ...

  4. HDU1285拓扑排序模版题

    方法一: #include<iostream> #include<algorithm> #include<cstring> #include<cmath> ...

  5. poj2367拓扑排序模版题

    方法一: 采用二位数组的形式(也可以用邻接表形式) #include<iostream> #include<algorithm> #include<cstring> ...

  6. HDU4857拓扑排序模版题

    方法一: #include<iostream> #include<algorithm> #include<cstring> #include<cmath> ...

  7. HDU5154拓扑排序模版题

    方法一: 采用邻接表的形式: #include<iostream> #include<algorithm> #include<cstring> #include&l ...

  8. 最短工期 (25 分)【拓扑排序模板】

    立志用最少的代码做最高效的表达 一个项目由若干个任务组成,任务之间有先后依赖顺序.项目经理需要设置一系列里程碑,在每个里程碑节点处检查任务的完成情况,并启动后续的任务.现给定一个项目中各个任务之间的关 ...

  9. leetcode阶段总结——拓扑排序

    leetcode阶段总结--拓扑排序 leetcode中经常出现的题型之一.其中,拓扑排序的概念可以参考这里,这里主要总结一下前300题中出现的几个关于拓扑排序的题,以待之后复习的时候查找. leet ...

最新文章

  1. graphpad两组t检验_Graphpad 作图教程 | 手把手教你绘制森林图
  2. 逃课上网吧编程、玩摇滚的另类学生,逆袭成长为独角兽公司的 CTO
  3. Java程序设计学习笔记(四)—— GUI
  4. 使用request对象进行数据传递
  5. 图片上传unexpected end of stream
  6. 2019第十届蓝桥杯C/C++ B组省赛 —— 第二题:年号字串
  7. sql 数据库 实例删除
  8. “数据驱动、智能引领”,打造未来智能小镇“样板间”
  9. 贪心法——部分背包问题
  10. java实体null值显示_java反射实现前端接收实体对象,去除“null”字符串(示例代码)...
  11. 用 Servlet 进行上载的原理和实现
  12. 何凯明 Single Image Haze Removal Using Dark Channel Prior
  13. c语言库函数大全文库,C语言库函数源代码
  14. json格式的字符数据转换成map格式
  15. bootstrap-table重载_Bootstrap Table的使用总结
  16. 提示“8080端口号被占用
  17. Win7激活工具无效?输入SLMGR -REARM显示不是内部命令?
  18. 高通平台 pmic—gpio修改(一)
  19. 信号是受噪声Nt干扰的余弦波Xt = Acoswt + φ + Nt,试求它的自相关函数。假设φ是在[0, 2Π]上均匀分布的随机变量,Nt是均值为0方差为σ2的白噪声,且 Nt 与 φ 互不相关。
  20. c语言字符怎么运算,c语言运算符号(c语言如何输入运算符号)

热门文章

  1. 机器学习之多元线性回归问题综合应用示例:简单案例+解决红酒质量的判断问题
  2. win10硬盘锁怎么解除_手把手教你win10系统中BitLocker加密磁盘无法解锁的解决手段...
  3. Macbook M1芯片软件记录
  4. 2004-2019年286个地级市实际利用外资
  5. D-MNSV7-X16搬运机器人磁导航传感器RS232|RS485与CAN自动输出协议及AGV系统构架
  6. python web flask 立项
  7. 微信小程序开发:小程序的本地数据缓存
  8. 关于Sass和Less牵扯的问题
  9. 【设计经验】3、ISE中烧录QSPI Flash以及配置mcs文件的加载速度与传输位宽
  10. 中国电信服务器虚拟化,中国电信虚拟化软件集采:华为华三崛起,外资全面败退...