今天的题,用例都是有序的,可以不加排序那句(少个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;
}
};