干了好久,参考柳神的代码,套用凡神的模板,终于写出了自己满意的代码,唉,还是太弱了,还得练习。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 10010, INF = 0x3fffffff;
int line[maxn][maxn];
vector<int> G[maxn];
bool vis[maxn];
int start,ed;
int getTransfer(vector<int> v)
{
int cnt = -1, preLine = 0;
for(int i=1; i<v.size(); i++){
if(line[v[i]][v[i-1]] != preLine){
cnt++;
preLine = line[v[i]][v[i-1]];
}
}
return cnt;
}
vector<int> path, tmpPath;
int minCnt, minTransfer;
void DFS(int id, int cnt)
{
tmpPath.push_back(id);
if(id == start)
{
int transfer = getTransfer(tmpPath);
if(cnt < minCnt)
{
minCnt = cnt;
minTransfer = transfer;
path = tmpPath;
}else if(cnt==minCnt && transfer<minTransfer)
{
minTransfer = transfer;
path = tmpPath;
}
tmpPath.pop_back();
return;
}
vis[id] = true;
for(int i = 0; i < G[id].size(); ++i)
{
int nex = G[id][i];
if(vis[nex] == false)
DFS(nex, cnt+1);
}
vis[id] = false;
tmpPath.pop_back();
}
int main()
{
int n, m;
int tmp, pre;
scanf("%d", &n);
for(int i = 1; i <= n; ++i)
{
scanf("%d%d", &m, &pre);
for(int j = 1; j < m; ++j)
{
scanf("%d", &tmp);
line[pre][tmp] = line[tmp][pre] = i;
G[tmp].push_back(pre);
G[pre].push_back(tmp);
pre = tmp;
}
}
scanf("%d", &n);
for(int i = 0; i < n; ++i)
{
minCnt = 99999, minTransfer = 99999;
scanf("%d %d", &start, &ed);
memset(vis, false ,sizeof(vis));
DFS(ed, 0);
printf("%d\n", minCnt);
int nex;
int preLine = 0, preTranfer = start;
for(int j = path.size()-1; j>0; --j)
{
if(preLine != line[path[j]][path[j-1]])
{
if(preLine!=0) printf("Take Line#%d from %04d to %04d.\n", preLine, preTranfer, path[j]);
preLine = line[path[j]][path[j-1]];
preTranfer = path[j];
}
}
printf("Take Line#%d from %04d to %04d.\n", preLine, preTranfer, ed);
path.clear();
}
return 0;
}