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.

 

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇