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;
}
posted @ 2024-04-10 19:47  YuKiCheng  阅读(23)  评论(0编辑  收藏  举报