码迷,mamicode.com
首页 > 其他好文 > 详细

P1137 旅行计划

时间:2020-01-30 14:09:24      阅读:78      评论:0      收藏:0      [点我收藏+]

标签:存储   name   tor   题解   bfs   back   pop   多少   iterator   

这题很简单,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

P1137 旅行计划

标签:存储   name   tor   题解   bfs   back   pop   多少   iterator   

原文地址:https://www.cnblogs.com/the-Blog-of-Mikasa/p/12242623.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!