写了近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;
}