P1137 旅行计划

前言:

这是道图论题,当然,搜索也行;

做题的中心我放在拓扑排序上

需要帮助吗(什么是拓扑排序?

分析:

拓扑排序的模板一个!!!

题目:P1137 旅行计划

代码:

/*
说真的,其实这道题很简单

就是拓扑排序后把每个点的“等级”
输出一遍

问题是,拓扑排序是什么 
队列啊
(因为我也解释不清) 

qwq 
*/


#include<iostream>
#include<queue>

using namespace std;
queue<int> q;
//存链表不能停 
struct lian{
    int to;
    int next;
}lb[200010];
int le[201000];//等级 
int head[200100]; 
int t=0;
int n,m,ans;
int ind[200100];//入度 
void add(int from,int to){
    lb[++t].next=head[from];// 指向的下一条边的下标 
    lb[t].to=to;//指向的点 
    head[from]=t;//出发点所连的第一条边的编号 
}//既然你会看这个,就一定会链表吧 
int main(){
    cin>>n>>m;
    for(int i=1;i<=m;++i)
    {
        int k,j;
        cin>>k>>j;
        add(k,j);
        ind[j]++;//统计入度 
    }
    for(int i=1;i<=n;++i){
        if(!ind[i]){//找到无入边的点 
        q.push(i);//压进队列 
        le[i]=1;
        }
        
    }//拓扑排序 
    while(q.size()){
        int u;
        u=q.front();q.pop();
        for(int i=head[u];i;i=lb[i].next)//遍历所连的边 
        {
            int v=lb[i].to;//找到指向的点 
            le[v]=max(le[v],le[u]+1);//计算该点的等级 
            if(!--ind[v]) q.push(v);//减入度,删边,为零则压入 
        }
    }
    for(int i=1;i<=n;++i)
    cout<<le[i]<<endl;//输出等级 
    
}

(很清楚明了吧)

(在MIKU小姐的帮助下,一个小时做完了)

THANKS FOR YOUR READING

THAT'S ALL.

原文地址:https://www.cnblogs.com/For-Miku/p/10505643.html