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