【洛谷p1137】旅行计划
这个题开始我以为打个最短路能过……但是仔细阅读题意发现起点是不确定的,所以不可能用最短路
我们可以看出,这个图是个DAG,因为他说,所有的路都是从西向东,不可能存在环,所以我们可以跑个拓扑排序,一边跑一边求答案
#include<iostream> #include<cstring> #include<cstdio> #include<queue> using namespace std; queue<int>qwq; int n,m,x,y,ans[100010],head[100010],tail,ru[100010]; struct in { int to,ne; }ter[200020]; inline void build(int f,int l) { ter[++tail]=(in){l,head[f]},head[f]=tail; } int main() { memset(head,-1,sizeof(head)); scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) scanf("%d%d",&x,&y),build(x,y),ru[y]++; for(int i=1;i<=n;i++) if(!ru[i]) qwq.push(i),ans[i]=1;//所有入度为0的点答案都是确定的 while(!qwq.empty()) { int qaq=qwq.front(); for(int i=head[qaq];i>0;i=ter[i].ne) { int t=ter[i].to; ans[t]=max(ans[t],ans[qaq]+1),ru[t]--;//取个最大值,入度减一 if(!ru[t]) qwq.push(t);//入度为0就入队 } qwq.pop(); } for(int i=1;i<=n;i++) printf("%d\n",ans[i]); }