PAT甲级 1131 - Subway Map

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Mr0cheng/article/details/79375474

Each station interval belongs to a unique subway line.这句话比较重要,所以在进行dfs的时候记录区间,会方便很多。

#include<bits/stdc++.h>
using namespace std;
const int maxn=10000+10;
vector<pair<int,int> >vp;
int temp[maxn][maxn];
vector<int> ansLine,line,edge[maxn];
vector<pair<int,int> > ansStation,routine;
vector<pair<int,pair<int,int> > >vpp;
bool visited[maxn];
void init(){
    ansLine.clear();
    line.clear();
    ansStation.clear();
    routine.clear();
    vpp.clear();
    fill(visited,visited+maxn,false);
}

void output(){
    vector<int>::iterator it=ansLine.begin();
    vector<pair<int,int> >::iterator its=ansStation.begin();
    int pre = *it,s=its->first,e=its->second;
    for(it=it+1,its=its+1;it!=ansLine.end();++it,++its){
        if(*it!=pre){
            vpp.push_back(make_pair(pre,make_pair(s,e)));
            pre=*it;
            s=its->first;
        }
        e=its->second;
    }
    vpp.push_back(make_pair(pre,make_pair(s,e)));
    printf("%d\n",ansStation.size());
    for(vector<pair<int,pair<int,int> > >::iterator ite=vpp.begin();ite!=vpp.end();++ite){
        printf("Take Line#%d from %04d to %04d.\n",ite->first,(ite->second).first,(ite->second).second);
    }
}

int getTransferNum(vector<int> v){
    int transfers=1;
    vector<int>::iterator it = v.begin();
    int pre = *it;
    for(it=it+1;it!=v.end();++it){
        if(*it!=pre){
            ++transfers;
            pre=*it;
        }
    }
    return transfers;
}

bool isAssign(){
    if(getTransferNum(ansLine) > getTransferNum(line) )return true;
    return false;
}

void dfs(int s,int e){
    if(s==e){
        bool flag=false;
        if(ansStation.empty())flag=true;
        if(!ansStation.empty()){
            if(routine.size()<ansStation.size())flag=true;
            else if(routine.size() == ansStation.size() && isAssign()) flag=true;
        }
        if(flag){
            ansStation.assign(routine.begin(),routine.end());
            ansLine.assign(line.begin(),line.end());
        }
        return;
    }
    for(vector<int>::iterator it=edge[s].begin();it!=edge[s].end();++it){
        if(!visited[*it]){
            line.push_back(temp[s][*it]);
            routine.push_back(make_pair(s,*it));
            visited[*it]=true;
            dfs(*it,e);
            visited[*it]=false;
            routine.pop_back();
            line.pop_back();
        }
    }
}
int main(){
    int n,m,u,v;
    scanf("%d",&n);
    for(int i=0;i<n;++i){
        scanf("%d",&m);
        u=-1;
        for(int j=0;j<m;++j){
            scanf("%d",&v);
            if(u!=-1){
                temp[v][u]=temp[u][v]=i+1;
                edge[u].push_back(v);
                edge[v].push_back(u);
            }
            u=v;
        }
    }

    int k;
    scanf("%d",&k);
    for(int i=0;i<k;++i){
        scanf("%d %d",&u,&v);
        dfs(u,v);
        output();
        init();
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/Mr0cheng/article/details/79375474