博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
「Luogu P3183」[HAOI2016]食物链 解题报告
阅读量:5110 次
发布时间:2019-06-13

本文共 1520 字,大约阅读时间需要 5 分钟。

身为一个蒟蒻,由于刷不过

于是出门左转写了道另一道假的食物链

这里的食物链条数其实就是有向图的路径数(应该是这么说吧,我弱)

思路:

拓扑(Topulogy)(一本正经的话说八道)+宽搜+乱搞+(由于本人很弱,所以想不出来了)……

不用先求拓扑序

一边遍历一边用 f数组 统计路径数

存个图,然后队列遍历,要注意的是单独的一个点不算一条链

所以就第一遍把单独的点处理出去(不进队列)

最后的问题就是累加了

如果这个点出度为0时,就

ans+= f[to]

否则更新f[to],并再次把to入队


#include
using namespace std;struct node{ int to,nxt;}b[200010];int n,t,T;int head[100010];int f[100010];int d[100010];int ans;int read(){ int s=0; char c=getchar(); while(!isdigit(c)) c=getchar(); while(isdigit(c)) { s=(s<<1)+(s<<3)+c-'0'; c=getchar(); } return s;}void add(int x,int y)//建边{ b[++t].to=y; b[t].nxt=head[x]; head[x]=t; return;}void Topulogy()//假的拓扑(英语不好){ int i; int cur,to; queue
p; for(i=1;i<=n;i++)//初始化入度为0的点(不包括单独的点) if(!d[i]&&head[i])//分别判断入度为0和是否是单独的点 { f[i]=1;//初始化路径数,否则会都是0哦~ p.push(i); } while(!p.empty()) { cur=p.front();p.pop(); for(i=head[cur];i;i=b[i].nxt) { to=b[i].to; d[to]--; f[to]+=f[cur]; if(d[to]==0) { if(!head[to]) ans+=f[to]; else p.push(to);//只有入度为0且出度不为0时才入队 } } } return;}int main(){ int x,y; n=read();T=read(); while(T--) { x=read();y=read(); add(x,y);//建边 d[y]++;//入度 } Topulogy(); printf("%d",ans); return 0;}

转载于:https://www.cnblogs.com/hovny/p/10130790.html

你可能感兴趣的文章
SDN第四次作业
查看>>
DM8168 DVRRDK软件框架研究
查看>>
django迁移数据库错误
查看>>
yii 跳转页面
查看>>
洛谷 1449——后缀表达式(线性数据结构)
查看>>
Data truncation: Out of range value for column 'Quality' at row 1
查看>>
Dirichlet分布深入理解
查看>>
(转)Android之发送短信的两种方式
查看>>
字符串处理
查看>>
HtmlUnitDriver 网页内容动态抓取
查看>>
ad logon hour
查看>>
获得进程可执行文件的路径: GetModuleFileNameEx, GetProcessImageFileName, QueryFullProcessImageName...
查看>>
证件照(1寸2寸)拍摄处理知识汇总
查看>>
罗马数字与阿拉伯数字转换
查看>>
Eclipse 反编译之 JadClipse
查看>>
Python入门-函数
查看>>
[HDU5727]Necklace(二分图最大匹配,枚举)
查看>>
距离公式汇总以及Python实现
查看>>
设计模式之装饰者模式
查看>>
一道不知道哪里来的容斥题
查看>>