前言:
这是道图论题,当然,搜索也行;
做题的中心我放在拓扑排序上
需要帮助吗(什么是拓扑排序?)
分析:
拓扑排序的模板一个!!!
题目: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.