L3-014 周游世界
这题思路不难,但是真的真的不太好写。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 10000;
const int inf = 0x3f3f3f3f;
vector<int> vec[maxn];
int line[maxn][maxn];
vector<int> tmp;//临时存放
vector<int> res;//最终结果
int vis[maxn];//已经来过了
int jtz=inf,hcs=inf;//经停站 换乘数
bool arrived;
int calhcs() { //计算换乘数
int preline = -1;//上一个
int ans = 0;//数量
for(int i=1; i<tmp.size(); i++) {
int curline=line[tmp[i]][tmp[i-1]];
if(preline != curline) {
ans++;
preline = curline;
}
}
return ans;
}
void dfs(int cur,int ed) {
if(cur == ed) { //到达了终点站
tmp.push_back(cur);
arrived = true;
//比较经停站
if(tmp.size()<jtz) { //更新
res = tmp;
jtz = tmp.size();
hcs = calhcs();
} else if(tmp.size()==jtz) {
int hc = calhcs();
if(hc < hcs) { //更新
res = tmp;
hcs = hc;
}
}
tmp.pop_back();
return;
}
vis[cur]=1;
tmp.push_back(cur);
for(int i=0; i<vec[cur].size(); i++) {
if(!vis[vec[cur][i]]) {
dfs(vec[cur][i],ed);
}
}
tmp.pop_back();
vis[cur]=0;
}
int main() {
int n;
cin>>n;
for(int i=1; i<=n; i++) {
int count;
cin>>count;
int a,b;
cin>>a;
for(int j=1; j<count; j++) {
cin>>b;
vec[a].push_back(b);
vec[b].push_back(a);
line[a][b]=line[b][a]=i;//a到b这个服务区间属于那个公司
a = b;
}
}
int k;
cin>>k;
while(k--) {
memset(vis,0,sizeof(vis));
jtz=hcs=inf;
arrived=false;
int start,ed;
cin>>start>>ed;
dfs(start,ed);
if(arrived){
printf("%d",jtz-1);
printf("\n");
//遍历res集合找到公司
int preline = line[res[0]][res[1]];
int pre = res[0];
int prend = res[1];
for(int i=2;i<res.size();i++){
if(preline != line[res[i]][res[i-1]]){//如果不同
printf("Go by the line of company #%d from %04d to %04d.\n",preline,pre,prend);
preline=line[res[i]][res[i-1]];
pre = prend;
prend = res[i];
}else{
prend = res[i];//preline不会改变
}
}
printf("Go by the line of company #%d from %04d to %04d.\n",preline,pre,prend);
}else{
printf("Sorry, no line is available.\n");
}
}
return 0;
}