zoukankan      html  css  js  c++  java
  • 【luogu1137】旅行计划 [拓扑排序]

    P1137 旅行计划

    最长路 DAG 拓扑排序的过程中直接 DP

    算是从头开始图论的学习....emmmmmmm

    通常情况下,在实现的时候会维护一个队列以及每个结点的入度。在删 除边的时候顺便把相应结点的入度减去,当这个结点入度为 0 的时候直接 将其加入队列。

    大概对图论形成了惯性思维 看到就怕QAQ

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<queue>
     4 #include<cstring>
     5 #include<cmath>
     6 #include<stack>
     7 #include<algorithm>
     8 using namespace std;
     9 #define ll long long
    10 #define rg register
    11 const int N=100000+5,M=200000+5,inf=0x3f3f3f3f,P=19650827;
    12 int n,m,r[N],f[N];
    13 template <class t>void rd(t &x)
    14 {
    15     x=0;int w=0;char ch=0;
    16     while(!isdigit(ch)) w|=ch=='-',ch=getchar();
    17     while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    18     x=w?-x:x;
    19 }
    20 
    21 int head[N],tot=0;
    22 struct edge{int v,nxt;}e[M];
    23 void add(int u,int v){
    24     e[++tot]=(edge){v,head[u]};head[u]=tot;
    25 }
    26 
    27 queue<int> q;
    28 void topsort(){
    29     for(rg int i=1;i<=n;++i)
    30     if(!r[i]) q.push(i),f[i]=1;
    31     while(!q.empty()){
    32         int u=q.front();q.pop();
    33         for(rg int i=head[u];i;i=e[i].nxt){
    34             int v=e[i].v;
    35             --r[v];
    36             if(!r[v]) q.push(v),f[v]=f[u]+1;
    37         }
    38     }
    39 }
    40 
    41 int main(){
    42     memset(r,0,sizeof(r));
    43     rd(n),rd(m);
    44     for(rg int i=1;i<=m;++i){
    45         int u,v;
    46         rd(u),rd(v);
    47         add(u,v),++r[v];
    48     }
    49     topsort();
    50     for(rg int i=1;i<=n;++i) printf("%d
    ",f[i]);
    51     return 0;
    52 }
    53  
  • 相关阅读:
    2017.3.17作业
    2017.3.16作业
    2017.3.15作业
    2017.3.14作业
    2017.3.13作业
    2017.3.10作业
    网站流量日志分析(数据 采集之 Flume 采集)
    网站流量日志分析(模块开发——数据仓库设计)
    日常问题及解决
    可爱的生活
  • 原文地址:https://www.cnblogs.com/lxyyyy/p/10923484.html
Copyright © 2011-2022 走看看