pat A 1131

写了近90分钟才过,菜鸡如我

#include<cstdio>
#include<iostream>
#include<vector>
#include<set>
#include<string>
#include<sstream>
#include<map>
#include<algorithm>
#include<unordered_map>
#include<regex>
#include<queue>
using namespace std;
const int inf = 9999999;
vector<vector<int>> g(110);
vector<vector<int>> line(10010);
int minstep = inf;
struct node {
	int lineindex, busstop;
	node(int a, int b) {
		lineindex = a;
		busstop = b;
	}
};
vector<node> tmpline, finline;
int visit[10010];
void dfs(int s, const int e, int step)
{
	if (s != e && step == minstep)return;
	if (step > minstep)return;
	if (s == e) {
		if (step < minstep) {
			minstep = step;
			finline.clear();
			finline = tmpline;
		}
		else if (step == minstep)
		{
			int curcg = 0;
			for (int i = 0; i < tmpline.size() - 1; ++i)
			{
				if (tmpline[i].lineindex != tmpline[i + 1].lineindex)curcg++;
			}
			int mincg = 0;
			for (int i = 0; i < finline.size() - 1; ++i)
			{
				if (finline[i].lineindex != finline[i + 1].lineindex)mincg++;
			}
			if (curcg < mincg) {
				finline.clear();
				finline = tmpline;
			}
		}
		return;
	}
	for (int m = 0; m < line[s].size(); ++m)
	{
		int curline = line[s][m], index;
		for (int i = 0; i < g[curline].size(); ++i)
		{
			if (g[curline][i] == s) {
				index = i;
				break;
			}
		}
		if (index + 1 < g[curline].size())
		{
			int ne = g[curline][index + 1];
			if (visit[ne] == 0)
			{
				visit[ne] = 1;
				node a(curline, ne);
				tmpline.push_back(a);
				dfs(ne, e, step + 1);
				tmpline.pop_back();
				visit[ne] = 0;
			}
		}
		if (index - 1 >= 0)
		{
			int ne = g[curline][index - 1];
			if (visit[ne] == 0)
			{
				visit[ne] = 1;
				node a(curline, ne);
				tmpline.push_back(a);
				dfs(ne, e, step + 1);
				tmpline.pop_back();
				visit[ne] = 0;
			}
		}
	}
}
int main()
{
	//freopen("test.txt", "r", stdin);
	int n;
	scanf("%d", &n);
	for (int i = 1; i <= n; ++i)
	{
		int m;
		scanf("%d", &m);
		while (m--) {
			int x;
			scanf("%d", &x);
			g[i].push_back(x);
			line[x].push_back(i);
		}
	}
	int q;
	scanf("%d", &q);
	while (q--)
	{
		memset(visit, 0, sizeof(visit));
		minstep = inf;
		finline.clear();
		tmpline.clear();
		int s, e;
		scanf("%d%d", &s, &e);
		dfs(s, e, 0);
		int pre = s;
		printf("%d\n", minstep);
		for (int i = 0; i < finline.size() - 1; ++i)
		{
			if (finline[i].lineindex != finline[i + 1].lineindex) {
				printf("Take Line#%d from %04d to %04d.\n", finline[i].lineindex, pre, finline[i].busstop);
				pre = finline[i].busstop;
			}
		}

		printf("Take Line#%d from %04d to %04d.\n", finline[finline.size()-1].lineindex, pre, finline[finline.size()-1].busstop);
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值