P1137 旅行计划
Posted the-blog-of-mikasa
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1137 旅行计划相关的知识,希望对你有一定的参考价值。
这题很简单,1分钟想出思路,5分钟打出代码(全WA),找错5分钟(主要是有坑qwq),码量并不长
主要是打了几天线段树,树链剖分(动不动就是几百行代码),写写题解放松一下
本题解力求通俗易懂
题意
给出一个有向图,从任一城市出发到一城市(可以是它本身)最多经过多少城市
思路+代码
拿到题首先分析样例
RT
城市1:1(1)
城市2:1->2(2)
城市3:1->2->3(3)
城市4:1->2->3->4(4)
城市5:1->2->5(3)
手动推一下很明显,从入度为0的节点向下扩展
那么就用dfs或bfs实现
我选择了bfs(即spfa)
代码如下
#include<bits/stdc++.h>
using namespace std;
vector<int> to[100010];
bool used[100010];
int ans[100010];
int main( ){
int n,m,x,y,j;
vector<int>::iterator i;
scanf("%d%d",&n,&m);
while(m--){
scanf("%d%d",&x,&y);
to[x].push_back(y);
} //输入+存储
queue<int>q;
q.push(1);
ans[1]=1; //初始化
while(!q.empty()){ //sppfa模板
x=q.front( );
q.pop( );
used[x]=0;
for(i=to[x].begin();i<to[x].end();i++)
if(ans[*i]<ans[x]+1){
ans[*i]=ans[x]+1;
if(!used[*i]){
q.push(*i);
used[*i]=1;
}
}
}
for(j=1;j<=n;j++)
printf("%d
",ans[j]);
}
样例华丽通过
提交?全WA?
经过分析(看题解),原来出度为0的城市不止一座
说好的 ?均选择从城市1出发可以得到以上答案。? 呢????????
完美AC代码
#include<bits/stdc++.h>
using namespace std;
vector<int> to[100010];
bool used[100010],ok[100010];
int ans[100010];
int main( ){
int n,m,x,y,j;
vector<int>::iterator i;
scanf("%d%d",&n,&m);
while(m--){
scanf("%d%d",&x,&y);
ok[y]=1; //记录入度是否为0
to[x].push_back(y);
}
queue<int>q;
for(j=1;j<=n;j++) //存入所有入度为0的城市
if(!ok[j]){
q.push(j);
ans[j]=1;
used[j]=1;
}
while(!q.empty()){
x=q.front( );
q.pop( );
used[x]=0;
for(i=to[x].begin();i<to[x].end();i++)
if(ans[*i]<ans[x]+1){
ans[*i]=ans[x]+1;
if(!used[*i]){
q.push(*i);
used[*i]=1;
}
}
}
for(j=1;j<=n;j++)printf("%d
",ans[j]);
}
完美AC
以上是关于P1137 旅行计划的主要内容,如果未能解决你的问题,请参考以下文章