您的位置:首页 > 其它

PAT甲级 1131 - Subway Map

2018-02-26 11:48 393 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: