1111. Online Map (30)
来源:互联网 发布:长江证券mac版本 编辑:程序博客网 时间:2024/06/11 23:49
1111. Online Map (30)
解题思路:
Dijkstra储存最短路径,dfs找最优路径
破题,呸(:з」∠)
AC代码
//简化了一下代码,2017.9.7#include <iostream>#include <cstdio>#include <vector>using namespace std;const int Inf=999999;int vn,an,s,e;vector<vector<int>> vT(512,vector<int>(512,Inf));//timeAdjMvector<vector<int>> vL(512,vector<int>(512,Inf));//lengthAdjMvector<int> sp,fp;//储存最终结果路径,最短和最快int mintime=Inf,ansdis=-1;//最短路径不唯一,取时间最短int minsect=Inf,anstim=-1;//最短时间不唯一,取最少交叉口void dijkstra(vector<vector<int>> &v,vector<vector<int>> &path)//dijkstra求解满足初始条件的所有解,v为邻接矩阵,path返回保存路径{ vector<int> dis(v[s]); vector<bool> vis(vn,false); vis[s]=true; while(true) { int mind=Inf,u=-1; for(int j=0;j<vn;++j) { if(!vis[j]&&dis[j]<mind) mind=dis[u=j]; } if(u==-1) return; vis[u]=true; for(int w=0;w<vn;++w) { if(!vis[w]&&dis[w]>dis[u]+v[u][w]) { dis[w]=dis[u]+v[u][w]; path[w].clear(); path[w].push_back(u); } else if(!vis[w]&&dis[w]==dis[u]+v[u][w]) path[w].push_back(u); } }}void shortpath(vector<vector<int>>&lenp,vector<int> &rp,int cur,int timesum,int dis)//dfs筛选最优路径{ if(s==cur&×um<mintime) { mintime=timesum; sp=rp; ansdis=dis; return; } for(auto pre:lenp[cur]) { rp.push_back(pre); shortpath(lenp,rp,pre,timesum+vT[pre][cur],dis+vL[pre][cur]); rp.pop_back(); }}void fastpath(vector<vector<int>>&timp,vector<int> &rp,int cur,int tim,int seccnt)//dfs筛选最优路径{ if(s==cur&&seccnt<minsect) { minsect=seccnt; fp=rp; anstim=tim; return; } for(auto pre:timp[cur]) { rp.push_back(pre); fastpath(timp,rp,pre,tim+vT[pre][cur],seccnt+1); rp.pop_back(); }}int main(int argc, char const *argv[]){ cin>>vn>>an; for(int i=0;i<an;++i) { int u,w,oneway,length,time; cin>>u>>w>>oneway>>length>>time; vL[u][w]=length; vT[u][w]=time; if(oneway==0) { vL[w][u]=length; vT[w][u]=time; } } cin>>s>>e; vector<vector<int>> timp(vn),lenp(vn);//时间路径,长度路径 for(int i=0;i<vn;++i) { if(vL[s][i]<Inf) lenp[i].push_back(s); if(vT[s][i]<Inf) timp[i].push_back(s); } dijkstra(vL,lenp); dijkstra(vT,timp); vector<int> rp;//记录可能的路径 shortpath(lenp,rp,e,0,0); fastpath(timp,rp,e,0,0); if(sp==fp) { printf("Distance = %d; Time = %d: ",ansdis,anstim); for(auto it=sp.rbegin();it!=sp.rend();++it) printf("%d -> ",*it); printf("%d\n",e); } else { printf("Distance = %d: ",ansdis); for(auto it=sp.rbegin();it!=sp.rend();++it) printf("%d -> ",*it); printf("%d\n",e); printf("Time = %d: ",anstim); for(auto it=fp.rbegin();it!=fp.rend();++it) printf("%d -> ",*it); printf("%d\n",e); } return 0;}
//previous_code#include <cstdio>#include <vector>using namespace std;const int maxv=502,INF=0x7fffffff;int n,m,s,e;int arclen[maxv][maxv],arctim[maxv][maxv];int distim[maxv],dislen[maxv],vistim[maxv],vislen[maxv];vector<int> sp[maxv],temps,anss;vector<int> fp[maxv],tempf,ansf;int mintime=0x7fffffff,minsec=0x7fffffff;int distancex=0x7fffffff,time=0;void InitAdjMatrix(){ for(int i=0;i<n;++i) { for(int j=0;j<n;++j) { i==j? arclen[i][j]=arclen[j][i]=arctim[i][j]=arctim[j][i]=0: arclen[i][j]=arclen[j][i]=arctim[i][j]=arctim[j][i]=INF; } }}void InitDisArray(){ for(int i=0;i<n;++i) { dislen[i]=arclen[s][i]; if(arclen[s][i]<INF&&i!=s) sp[i].push_back(s);//前驱节点 distim[i]=arctim[s][i]; if(arctim[s][i]<INF&&i!=s) sp[i].push_back(s);//前驱节点 }}void ShortPath(){ int min,v; vislen[s]=1; for(int i=0;i<n;++i) { min=INF; for(int k=0;k<n;++k) { if(vislen[k]==0&&dislen[k]<min) { min=dislen[k]; v=k; } } vislen[v]=1; for(int w=0;w<n;++w) { if(arclen[v][w]<INF&&vislen[w]==0) { if(dislen[v]+arclen[v][w]<dislen[w]) { dislen[w]=dislen[v]+arclen[v][w]; sp[w].clear(); sp[w].push_back(v); } else if(dislen[v]+arclen[v][w]==dislen[w]) { sp[w].push_back(v); } } } }}void dfsSP(int u,int timecnt,int discnt){ temps.push_back(u); if(u==s) { if(discnt<distancex||(distancex==discnt&&mintime>timecnt)) { mintime=timecnt; anss.clear(); anss=temps; distancex=discnt; } } for(auto it=sp[u].begin();it!=sp[u].end();++it) { dfsSP(*it,timecnt+arctim[*it][u],discnt+arclen[*it][u]); } temps.pop_back();}void FastPath(){ int min,v; for(int i=0;i<n;++i) { min=INF; for(int k=0;k<n;++k) { if(vistim[k]==0&&distim[k]<min) { min=distim[k]; v=k; } } vistim[v]=1; for(int w=0;w<n;++w) { if(arctim[v][w]<INF&&vistim[w]==0) { if(distim[v]+arctim[v][w]<distim[w]) { distim[w]=distim[v]+arctim[v][w]; fp[w].clear(); fp[w].push_back(v); } else if(distim[v]+arctim[v][w]==distim[w]) { fp[w].push_back(v); } } } }}void dfsFP(int u,int secnt,int timcnt){ tempf.push_back(u); if(u==s) { if(secnt<minsec) { minsec=secnt; ansf.clear(); ansf=tempf; time=timcnt; } } for(auto it=fp[u].begin();it!=fp[u].end();++it) { dfsFP(*it,secnt+1,timcnt+arctim[*it][u]); } tempf.pop_back();}int main(){ scanf("%d %d",&n,&m); InitAdjMatrix(); for(int i=0;i<m;++i) { int v1,v2,one,len,tim; scanf("%d %d %d %d %d",&v1,&v2,&one,&len,&tim); arclen[v1][v2]=len; arctim[v1][v2]=tim; if(one==0) { arclen[v2][v1]=arclen[v1][v2]; arctim[v2][v1]=arctim[v1][v2]; } } scanf("%d %d",&s,&e); InitDisArray(); ShortPath(); dfsSP(e,0,0); FastPath(); dfsFP(e,1,0); if(anss==ansf) { printf("Distance = %d; Time = %d: ",distancex,time); for(auto it=anss.rbegin();it!=anss.rend();++it) it!=anss.rend()-1?printf("%d -> ",*it):printf("%d\n",*it); return 0; } printf("Distance = %d: ",distancex); for(auto it=anss.rbegin();it!=anss.rend();++it) it!=anss.rend()-1?printf("%d -> ",*it):printf("%d\n",*it); printf("Time = %d: ",time); for(auto it=ansf.rbegin();it!=ansf.rend();++it) it!=ansf.rend()-1?printf("%d -> ",*it):printf("%d\n",*it); return 0;}
直接dfs最后一个测试点是会超时的(毕竟有五百个点)
如下面这个代码:
#include <cstdio>#include <vector>using namespace std;const int maxv=502;int arclen[maxv][maxv],arctim[maxv][maxv];int minsec=0x7fffffff,mintime=0x7fffffff,mintimeOfminlen=0x7fffffff,minlen=0x7fffffff;int s,e,viss[maxv],visf[maxv],vis[maxv];vector<int> anss,ansf,p;vector<int> v[maxv];void dfs(int u,int vcnt,int timecnt,int lencnt){ vis[u]=1; p.push_back(u); if(u==e) { if(lencnt<minlen||(lencnt==minlen&&timecnt<mintimeOfminlen)) { minlen=lencnt; mintimeOfminlen=timecnt; anss.clear(); anss=p; } if(timecnt<mintime||(timecnt==mintime&&vcnt<minsec)) { mintime=timecnt; minsec=vcnt; ansf.clear(); ansf=p; } } for(auto it=v[u].begin();it!=v[u].end();++it) { if(vis[*it]==0) { dfs(*it,vcnt+1,timecnt+arctim[u][*it],lencnt+arclen[u][*it]); } } vis[p.back()]=0; p.pop_back();}int main(){ int n,m; scanf("%d %d",&n,&m); for(int i=0;i<m;++i) { int v1,v2,one,len,tim; scanf("%d %d %d %d %d",&v1,&v2,&one,&len,&tim); v[v1].push_back(v2); arclen[v1][v2]=len; arctim[v1][v2]=tim; if(one==0) { arclen[v2][v1]=arclen[v1][v2]; arctim[v2][v1]=arctim[v1][v2]; v[v2].push_back(v1); } } scanf("%d %d",&s,&e); dfs(s,1,0,0); if(anss==ansf) { printf("Distance = %d; Time = %d: ",minlen,mintime); for(auto it=anss.begin();it!=anss.end();++it) it!=anss.end()-1?printf("%d -> ",*it):printf("%d\n",*it); return 0; } printf("Distance = %d: ",minlen); for(auto it=anss.begin();it!=anss.end();++it) it!=anss.end()-1?printf("%d -> ",*it):printf("%d\n",*it); printf("Time = %d: ",mintime); for(auto it=ansf.begin();it!=ansf.end();++it) it!=ansf.end()-1?printf("%d -> ",*it):printf("%d\n",*it); return 0;}
0 0
- 1111. Online Map (30)
- 1111. Online Map (30)
- 1111. Online Map (30)
- 1111. Online Map (30)
- 1111. Online Map (30)
- 1111. Online Map (30)
- 1111. Online Map (30)
- 1111. Online Map (30)
- 1111. Online Map (30)
- PAT 1111. Online Map (30)
- pat 1111. Online Map (30)
- 1111. Online Map (30) <Dijkstra>
- solution Of Pat 1111. Online Map (30)
- 1111. Online Map (30)解题报告
- 1111. Online Map (30)[dijkstra算法]
- PAT(Advanced Level)1111. Online Map (30)
- 【PAT】【Advanced Level】1111. Online Map (30)
- PAT 1111. Online Map (30) Dijkstra
- Hibernate基础复习
- 神经网络之BP算法
- 织梦cms教程:自定义表单添加提交时间
- LeetCode:75. Sort Colors
- 滴滴面试总结
- 1111. Online Map (30)
- TCP可靠的数据传输
- 用thymeleaf用标签给页面select下拉框赋值
- CodeForces 755APolandBall and Hypothesis
- properties 的操作和运用实例
- TCP四次挥手
- 无法打开模块文件“C:\Users\Cathy\AppData\Local\Temp\.NETFramework,Version=v4.5.AssemblyAttributes.vb”
- TCP滑动窗口协议
- 中文按双字处理的案例