LC #815. 公交路线

今天的题,用例都是有序的,可以不加排序那句(少个60ms)。
看了题解的思路写的,先重构一个图,每一条路线看作一个节点,然后bfs。
刚开始本地跑起来和提交的结果不一样,后来发现是vis没有初始化,在codeblocks看未初始化的bool是一个整数,可能是因为这个原因吧。

class Solution {
public:
    int numBusesToDestination(vector<vector<int>>& routes, int S, int T) {
        bool vis[510];
        vector<int> g[510];
        fill(vis,vis+510,false);
        int len=routes.size();
        int maxid=-1;
        for(int i=0;i<len;i++){
            auto its=find(routes[i].begin(),routes[i].end(),S);
            auto itt=find(routes[i].begin(),routes[i].end(),T);
            if(its!=routes[i].end())g[505].push_back(i);
            if(itt!=routes[i].end())g[i].push_back(506);
            //sort(routes[i].begin(),routes[i].end());
        }
        for(int i=0;i<len;i++){
            for(int j=i+1;j<len;j++){
                int idx1=0,idx2=0;
                int size1=routes[i].size(),size2=routes[j].size();
                while(idx1<size1 && idx2<size2){
                    while(idx1<size1 && routes[i][idx1]<routes[j][idx2])idx1++;
                    while(idx1<size1 && idx2<size2 && routes[j][idx2]<routes[i][idx1])idx2++;
                    if(idx1<size1 && idx2<size2 && routes[j][idx2]==routes[i][idx1]){
                        g[j].push_back(i);
                        g[i].push_back(j);
                        break;
                    }
                }
            }
        }
        if(S==T && g[505].size()>0)return 0;
        //bfs
        queue<pair<int,int>> q;
        q.push(pair<int,int>(505,0));
        while(!q.empty()){
            auto fir=q.front();
            q.pop();
            vis[fir.first]=true;
            if(fir.first==506){
                return fir.second-1;
            }
            for(int i=0;i<g[fir.first].size();i++){
                if(!vis[g[fir.first][i]])
                    q.push(pair<int,int>(g[fir.first][i],fir.second+1));
            }
        }
        return -1;

    }
};

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值