topsort
现在给你n个物种和m条能量流动关系,求其中的食物链条数。
物种的名称为从1到n编号
M条能量流动关系形如
a1 b1
a2 b2
a3 b3
......
am-1 bm-1
am bm
其中ai bi表示能量从物种ai流向物种bi,注意单独的一种孤立生物不算一条食物链
简单但有意思的题目. 只问食物链条数,且符合生物学规定. 一般来说这句话出现的时候就说了是符合拓扑排序的. 计入入度和出度,特判入读和出度都为0.
好了,我这周的报告就完成了.
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int e[N],ne[N],h[N],idx;
int n,m,in[N],out[N];
int res[N];
void add(int a,int b)
{
e[idx] = b,ne[idx] = h[a],h[a] = idx++;
return;
}
void topsort()
{
queue<int> q;
for(int i = 1; i <= n; i++)
if(in[i] == 0)
{
res[i] = 1;
q.push(i);
}
for(int i = 1; i <= n; i++)
if(in[i] == 0 && out[i] == 0)
res[i] = 0;
while(q.size())
{
int t = q.front();
q.pop();
for(int i = h[t]; i != -1; i = ne[i])
{
int j = e[i];
in[j]--;
res[j] += res[t];
if(in[j] == 0)
q.push(j);
}
}
}
int main()
{
memset(h,-1,sizeof h);
cin >> n >> m;
while(m--)
{
int a,b;
cin >> a >> b;
add(a,b);
in[b] ++,out[a]++;
}
topsort();
int cnt = 0;
for(int i = 1; i <= n; i++)
if(out[i] == 0)
cnt += res[i];
cout << cnt;
return 0;
}
posted on 2022-01-17 20:04 zzzxxzxzxzxzxz 阅读(86) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现