一道题
luogu1137旅行计划
拓扑加一点dp
思路不难
基本的裸题
粘代码:
#include<iostream>
#include<cstdio>
using namespace std;
int n,m,in[100005],ans[200005],answ[100005];
int cnt,head[200005],tot,num,line,h;
bool used[100005];
struct node{
int to,next;
}edge[200005];
void add(int x,int y)
{
cnt++;
edge[cnt].to=y;
edge[cnt].next=head[x];
head[x]=cnt;
}
void tour()//拓扑排序
{
for(int i=1;i<=n;i++)
if(in[i]==0) ans[++tot]=i;
while(num<tot)
{
num++;
int u=ans[num];
for(int i=head[u];i;i=edge[i].next)
{
int v=edge[i].to;
in[v]--;
if(!in[v]) ans[++tot]=v;
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int x,y;
cin>>x>>y;
add(x,y);
in[y]++;
}
tour();
// for(int i=1;i<=n;i++) answ[i]=1;怎么写都行···
for(int i=1;i<=n;i++)
{
int u=ans[i];
for(int j=head[u];j;j=edge[j].next)
{
int v=edge[j].to;
answ[v]=max(answ[v],answ[u]+1);//dp的过程从前向后
}
}
for(int i=1;i<=n;i++) cout<<answ[i]+1<<endl;
return 0;
}
本文介绍洛谷1137旅行计划题目的解题思路,使用拓扑排序结合动态规划的方法求解最短路径问题。通过具体代码实现展示了如何进行节点间的遍历与状态更新。

407

被折叠的 条评论
为什么被折叠?



