luogu P1137 旅行计划

emmmmm

很久很久很久以前加到任务计划里的一道题

终于做了www

所以

这道题还是蛮简单的

大概有一点拓扑排序的思想?

虽然我到现在也不知道拓扑排序怎么应用23333

唔看一下题面吧

悄咪咪吐槽一下 改版之后真的丑www

emmmm

怎么讲呢

就是有向的图的遍历吧大概。。。(不靠谱的瞎说请不要盲目相信

上代码了(真草率

#include<cstdio>
#include<queue>
using namespace std;
#define maxn 200010

struct EDGE{
  int to,nxt;
}edge[maxn];

int head[maxn];
int cnt,d[maxn],vis[maxn];
queue<int>q;

void add(int x,int y){
  edge[++cnt].to = y;
  edge[cnt].nxt = head[x];
  head[x] = cnt;
}//存图

int main(){
  int n,m;
  scanf("%d%d",&n,&m);
  for(int i = 1;i <= m;i++){
    int a,b;
    scanf("%d%d",&a,&b);
    add(a,b);//存图,因为分东西所以有向
    d[b]++;//d数组记录每个点的入度
  }
  for(int i = 1;i <= n;i++)
    if(!d[i]){//入度为零可以作为起点遍历
      q.push(i);//入队
      vis[i] = 1;//走了一个城市
    }
  while(!q.empty()){
    int x = q.front();//取队首元素
    for(int i = head[x];i;i = edge[i].nxt){
      int v = edge[i].to;
      d[v]--;//入度减一,相当于删边
      if(!d[v]){//入度为零
    vis[v] = vis[x] + 1;//走过的城市数加一
    q.push(v);//入队
      }
    }
    q.pop();//biu~
  }
  for(int i = 1;i <= n;i++)
    printf("%d\n",vis[i]);//输出
  return 0;
}

(在此顺道吐槽一下改版后的代码字体,太丑了 |-|

挺好理解的