1131. Subway Map (30)

来源:互联网 发布:nginx 禁止某ip访问 编辑:程序博客网 时间:2024/05/21 22:29
#include<cstdio>#include<vector>using namespace std;const int maxn=10010;const int INF=0x3fffffff;vector<int> G[maxn];bool vis[maxn];int lines[maxn][maxn];vector<int> temp,ans;int st,ed;int minTransfer,minDepth;int calTransfer(vector<int> vc){    int ans=0,curLine=0;    for(int i=1;i<vc.size();i++){        int from=vc[i-1],to=vc[i];        if(lines[from][to]!=curLine){            curLine=lines[from][to];            ans++;        }    }    return ans;}void DFS(int index,int depth){    vis[index]=true;    temp.push_back(index);    if(index==ed){        if(depth<minDepth){            minDepth=depth;            minTransfer=calTransfer(temp);            ans=temp;           }else if(depth==minDepth){            int transfer=calTransfer(temp);            if(transfer<minTransfer){                minTransfer=transfer;                ans=temp;            }        }        temp.pop_back();        vis[index]=false;        return;    }    for(int i=0;i<G[index].size();i++){        if(vis[G[index][i]]==false){            DFS(G[index][i],depth+1);        }    }    vis[index]=false;    temp.pop_back();}void printPath(){    int head,curLine=0;    printf("%d\n",minDepth);    for(int i=1;i<ans.size();i++){        int from=ans[i-1],to=ans[i];        if(lines[from][to]!=curLine){            if(curLine!=0) printf("Take Line#%d from %04d to %04d.\n",curLine,head,from);            curLine=lines[from][to];            head=from;        }    }    printf("Take Line#%d from %04d to %04d.\n",curLine,head,ans[ans.size()-1]);}//void dfs(int v, int depth) //深度优先也可以这样写//{//    if (v == ed) { // 到终点//        if (depth < minDepth) {//            minDepth = depth;//            minTransfer = calTransfer(temp);//            ans = temp;//        } else if (depth == minDepth) {//            int transfer = calTransfer(temp);//            if (transfer < minTransfer) {//                minTransfer = transfer;//                ans = temp;//            }//        }//        return ;//    }//    for(int i = 0; i < G[v].size(); ++i) {//        int v2 = G[v][i];//        if (!vis[v2]) {//            vis[v2] = true;//            temp.push_back(v2);//            dfs(v2, depth+1);//            temp.pop_back();//            vis[v2] = false;//        }//    }//}int main(){    int n;    scanf("%d",&n);    for(int i=1;i<=n;i++){        int m,pre,next;        scanf("%d%d",&m,&pre);        for(int j=1;j<m;j++){            scanf("%d",&next);            G[pre].push_back(next);            G[next].push_back(pre);            lines[pre][next]=lines[next][pre]=i;            pre=next;        }    }       int k;    scanf("%d",&k);    while(k--){        scanf("%d%d",&st,&ed);        minTransfer=minDepth=INF;        ans.clear(),temp.clear();        DFS(st,0);//      temp.push_back(st);//        dfs(st, 0);//深度优先也可以这样写        printPath();    }    return 0; }