洛谷p1137旅行计划

题面

关于拓扑排序

因为这好几次考试的题目里都有在DAG中拓扑排序求最长/短路

txt说它非常的好用

就找了个题做了下

拓扑排序就是寻找图中所有的入度为零的点把他入队

然后再枚举它所有的连到的点,只要去掉它后又是一个入度为零的点就继续入队

在入队的过程中不断更新最小值

直至队列为空

Code:

#include 
#include 
#include 
using namespace std;
const int N = 1e5+7;
queue<int> q;
int n, m, head[N << 1], dis[N], rd[N];
struct node {int nxt, to;}e[N << 1];
int read() {
    int s = 0, w = 1; char ch = getchar();
    while(!isdigit(ch)) {if(ch == '-') w = -1; ch = getchar();}
    while(isdigit(ch)) {s = s * 10 + ch - '0'; ch = getchar();}
    return s * w;
}
int main() {
    n = read(), m = read();
    for(int i = 1, x, y; i <= m; i++) 
        x = read(), y = read(), e[i].nxt = head[x], e[i].to = y, head[x] = i, rd[y]++;
    for(int i = 1; i <= n; i++) 
        if(!rd[i]) dis[i] = 1, q.push(i);
    while(!q.empty()) {
        int he = q.front(); q.pop();
        for(int i = head[he]; i; i = e[i].nxt) {
            dis[e[i].to] = max(dis[e[i].to], dis[he] + 1);
            if(!--rd[e[i].to]) q.push(e[i].to);
        }
    }
    for(int i = 1; i <= n; i++) printf("%d\n", dis[i]);
    return 0;
} 

 

谢谢收看, 祝身体健康!

你可能感兴趣的:(洛谷p1137旅行计划)