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; }
相关文章推荐
- PAT甲级1131. Subway Map 最短路/bfs
- PAT 1131. Subway Map (30) -甲级
- PAT甲级1131
- PAT 甲级 1131. Subway Map (30)
- PAT 甲级1131. Subway Map (30)
- pat甲级1009. Product of Polynomials (25)
- 1028. List Sorting (25)-PAT甲级
- 1051. Pop Sequence (25)-PAT甲级真题
- PAT甲级索引
- 1137. Final Grading (25)-PAT甲级真题
- PAT 甲级-1003. Emergency (25)
- PAT甲级1015
- 1111. Online Map (30)-PAT甲级真题(Dijkstra + DFS)
- PAT-甲级-1017. Queueing at Bank【模拟】
- 1069. The Black Hole of Numbers (20)-PAT甲级真题
- PAT 甲级 1021 Deepest Root (并查集,树的遍历)
- PAT 甲级 1019. General Palindromic Number
- PAT 甲级 1002
- PAT甲级1005
- PAT程序设计考题——甲级1045 (最长不下降子序列) C++实现