zoukankan      html  css  js  c++  java
  • 洛谷 P4017 Topological sorting 模板

    例题洛谷 P4017:https://www.luogu.com.cn/problem/P4017

    求最大食物链的数量,题中已给出最大食物链的定义,可以转化定义一条链的起点就是入度为0的点,出度为0的点可以作为终点。注意食物网抽象出的有向图可能有多个。

    思路:只需一遍拓朴排序,动态累计记录一下答案即可,最终累加输出到终点的最大食物链数量即可。

    模板:

     1 bool toposort() {
     2     q = new queue();
     3     for (i = 0; i < n; i++)
     4         if (in_deg[i] == 0) q.push(i);
     5     ans = new vector();
     6     while (!q.empty()) {
     7         u = q.pop();
     8         ans.push_back(u);
     9         for each edge(u, v) {
    10             if (--in_deg[v] == 0) q.push(v);
    11         }
    12     }
    13     if (ans.size() == n) {
    14         for (i = 0; i < n; i++)
    15             std::cout << ans[i] << std::endl;
    16         return true;
    17     } else {
    18         return false;
    19     }
    20 }

    AC代码:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 const int maxn = 5e3+5;
     5 const ll mod = 80112002;
     6 struct node{
     7     vector<int> v;
     8     int in,out;
     9 }g[maxn];
    10 int n,m;
    11 ll ans[maxn];
    12 void add(int u,int v){
    13     g[v].v.push_back(u);
    14     g[v].out++,g[u].in++;   
    15 }
    16 void toposort(){
    17     queue<int> q;
    18     for(int i = 1;i<=n;i++) if(!g[i].in ) q.push(i),ans[i] = 1;
    19     while(!q.empty()){
    20         int cur = q.front();
    21         q.pop();
    22         for(int i = 0;i<g[cur].v.size();i++){
    23             int u = g[cur].v[i];
    24             ans[u] = (ans[u] + ans[cur])%mod;
    25             if(--g[u].in == 0) q.push(u);  
    26         }
    27     }
    28 }
    29 int main(){
    30     scanf("%d%d",&n,&m);
    31     for(int i = 1;i<=m;i++){
    32         int u,v;
    33         scanf("%d%d",&u,&v);
    34         add(u,v);
    35     }
    36     toposort();
    37     ll res = 0;
    38     for(int i = 1;i<=n;i++){
    39         if(!g[i].out ) res = (res+ans[i])%mod;
    40     }
    41     cout<<res;
    42     return 0;
    43 }
  • 相关阅读:
    Android SurfaceView实战 带你玩转flabby bird (上)
    linux释放内存的命令
    Linux上的free命令详解
    app后端设计(14)--LBS的偏移问题
    包床、退床
    oracle学习17
    提示在【办公管理】-->【今日工作】
    oracle学习16
    数据库的表信息
    CodeForces
  • 原文地址:https://www.cnblogs.com/AaronChang/p/12598547.html
Copyright © 2011-2022 走看看