标签:食物链 int 出度 入度 P4017 include 5050 拓扑
看到拓扑排序感觉非常遥远的复杂,不喜欢图。看了拓扑排序的原理,很像广搜。
以本题样例为例:
了解一下 出度 和 入度
5的出度为3 入度为 0 ,3的出度为2 入度为2……
for循环 找到秃头 5 入队列, 然后给跟他有联系的所有点一一剃头,看谁再秃,秃了入队列,再对继往开来的秃子进行操作。
#include<cstdio> #include<iostream> #include<queue> using namespace std; int n,m,ru[5050],chu[5050],f[5050],a,t,ans,b,s[5050][5050]; //ru[]是入度,chu[]是出度(后面判断是否为尾巴用的),f[i]代表到i点多少条路径, s[][]邻接矩阵存储两点之间是否有联系。 queue<int> q; int main() { scanf("%d%d",&n,&m); for(int i=0;i<m;i++) { scanf("%d%d",&a,&b); ru[a]++; chu[b]++; s[b][a]=1; } for(int i=1;i<=n;i++) { if(ru[i]==0)//寻找先天的秃子 { q.push(i); f[i]=1; } } while(true) { if(q.empty())break;//秃子队列没了,就结束了。 t=q.front();//找出队列前端的秃子,暂存到t里。 q.pop();// 没用了的秃子消失吧。 for(int i=1;i<=n;i++) { if(s[t][i]==1)//找到和秃子有联系的家伙,间断它们之间的烦恼丝 { f[i]+=f[t];//凡是和它有联系的都要把方案+上它(递推),不懂这一点的递推做一做过河卒 f[i]=f[i]%80112002; ru[i]--;//剪掉入度 if(ru[i]==0)//看看秃了没有 { if(chu[i]==0)//看看到尾巴了吗?如果没有出度了,说明没有了后续,等着干啥,统计一下吧。 { ans+=f[i];//因为可能有多个尾巴,所以这里要用+=。如果没有这个,就是单尾巴。 ans=ans%80112002; continue; } q.push(i);//剪秃了,入队列吧。 } } else { continue; } } } cout<<ans; return 0; }
标签:食物链,int,出度,入度,P4017,include,5050,拓扑 来源: https://www.cnblogs.com/stdcpsx/p/13150742.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。