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\n",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\n",ans[j]);
}

完美AC

posted @ 2020-01-30 13:38  Mikasa_Ackerman  阅读(123)  评论(0编辑  收藏  举报