#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
vector<vector<int>> v(10000);
int visit[10000], minCnt, minTransfer, start, end1;
unordered_map<int, int> line;
vector<int> path, tmpPath;
int transferCnt(vector<int> a)
{
int cnt = -1, preLine = 0;
for(int i=1; i<a.size(); i++)
{
if(line[a[i-1]*10000+a[i]] != preLine) cnt++;
preLine = line[a[i-1]*10000+a[i]];
}
return cnt;
}
void dfs(int node, int cnt)
{
if(node == end1 && (cnt < minCnt || (cnt == minCnt && transferCnt(tmpPath)<minTransfer)))
{
minCnt = cnt;
minTransfer = transferCnt(tmpPath);
path = tmpPath;
}
if(node == end1) return;
for(int i=0; i<v[node].size(); i++)
{
if(visit[v[node][i]] == 0)
{
visit[v[node][i]] = 1;
tmpPath.push_back(v[node][i]);
dfs(v[node][i], cnt+1);
visit[v[node][i]] = 0;
tmpPath.pop_back();
}
}
}
int main()
{
int n, m, k, pre, tmp;
scanf("%d", &n);
for(int i=0; i<n; i++)
{
scanf("%d%d", &m, &pre);
for(int j=1; j<m; j++)
{
scanf("%d", &tmp);
v[pre].push_back(tmp);
v[tmp].push_back(pre);
line[pre*10000+tmp] = line[tmp*10000+pre] = i+1;
pre = tmp;
}
}
scanf("%d", &k);
for(int i=0; i<k; i++)
{
scanf("%d%d", &start, &end1);
minCnt = 9999, minTransfer = 9999;
tmpPath.clear();
tmpPath.push_back(start);
visit[start] = 1;
dfs(start, 0);
visit[start] = 0;
printf("%d\n", minCnt);
int preLine = 0, preTransfer = start;
for(int j=1; j<path.size(); j++)
{
if(line[path[j-1]*10000+path[j]] != preLine)
{
if(preLine != 0)
printf("Take Line#%d from %04d to %04d.\n", preLine, preTransfer, path[j-1]);
preLine = line[path[j-1]*10000+path[j]];
preTransfer = path[j-1];
}
}
printf("Take Line#%d from %04d to %04d.\n", preLine, preTransfer, end1);
}
return 0;
}
```
学习代码
#include <stdio.h>
#include <stdlib.h>
#define inf 0x3f3f3f3f
#define MAX 10002
int n,m,k;
int link[MAX][11],linknum[MAX];
int vis[MAX],path[MAX],num,ans[MAX],ant;
int line[MAX][11];
int getline(int a,int b)
{
for(int i = 0; i < linknum[a]; i ++)
if(link[a][i] == b)return line[a][i];
}
void dfs(int stop,int lastline,int lnum,int snum,int des)
{
path[snum] = stop;
if(snum > ant || snum == ant && lnum > num)return;
if(stop == des)
{
ant = snum;
num = lnum;
for(int i = 0; i <= snum; i ++)
{
ans[i] = path[i];
}
return;
}
for(int i = 0; i < linknum[stop]; i ++)
{
if(!vis[link[stop][i]])
{
vis[link[stop][i]] = 1;
int d = getline(stop,link[stop][i]);
if(lastline != d)dfs(link[stop][i],d,lnum + 1,snum + 1,des);
else dfs(link[stop][i],d,lnum,snum + 1,des);
vis[link[stop][i]] = 0;
}
}
}
int main()
{
int a,b;
scanf("%d",&n);
for(int i = 1; i <= n; i ++)
{
scanf("%d",&m);
scanf("%d",&a);
for(int j = 1; j < m; j ++)
{
scanf("%d",&b);
link[a][linknum[a] ++] = b;
line[a][linknum[a] - 1] = i;
link[b][linknum[b] ++] = a;
line[b][linknum[b] - 1] = i;
a = b;
}
}
scanf("%d",&k);
while(k--)
{
scanf("%d%d",&a,&b);
ant = num = MAX;
dfs(a,-1,-1,0,b);
printf("%d\n",ant);
int line1 = getline(ans[0],ans[1]);
for(int i = 2; i <= ant; i ++)
{
int line2 = getline(ans[i - 1],ans[i]);
if(line1 != line2)
{
printf("Take Line#%d from %04d to %04d.\n",line1,a,ans[i - 1]);
a = ans[i - 1];
line1 = line2;
}
}
printf("Take Line#%d from %04d to %04d.\n",line1,a,ans[ant]);
}
return 0;
}