您的位置:首页 > 其它

L3-007. 天梯地图

2018-03-23 21:57 274 查看
传送门:点击打开链接

这题处理比较麻烦,条件比较多,主要回顾一下怎么打印最短路径。

代码:

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
const int N = 510;
int n,m,s,e,dis

,t

,p
,low
,vis
,nds
,ph
;
int rt1
,rt2
,ct1,ct2,dt,tim;

void dij1(){
memset(vis,0,sizeof(vis));
memset(low,inf,sizeof(low));///输出最短路径全部初始化为无穷大 确保每一个最短路上的节点都有前驱
memset(nds,0,sizeof(nds));
for(int i=0;i<n;i++) p[i]=i;
vis[s]=1,low[s]=0;
for(int i=1;i<=n;i++) {///至少循环n次,从首节点开始
int mi=inf,pos=s;
for(int j=0;j<n;j++){
if(!vis[j]&&low[j]<mi){
mi=low[j];
pos=j;
}
}
vis[pos]=1;
for(int j=0;j<n;j++){
if(!vis[j] && low[pos]+dis[pos][j]<low[j]){
low[j]=low[pos]+dis[pos][j];
nds[j]=nds[pos]+1;
p[j]=pos;
}else if(!vis[j] && low[pos]+dis[pos][j]==low[j]){ ///路径长度相同选择经过节点数最少的
if(nds[j]>nds[pos]+1) {
nds[j]=nds[pos]+1;
p[j]=pos;
}
}
}
}
dt=low[e],ct1=0;
int tmp
;
tmp[ct1++]=e;
int k=e,j=0;
while(p[k]!=k){///打印路径
k=p[k];
tmp[ct1++]=k;
}
for(int i=ct1-1;i>=0;i--)
rt1[j++]=tmp[i];
}

void dij2(){
memset(vis,0,sizeof(vis));
memset(low,inf,sizeof(low));
memset(ph,inf,sizeof(ph));
for(int i=0;i<n;i++) p[i]=i;
vis[s]=1,low[s]=0;
for(int i=1;i<=n;i++){
int mi=inf,pos=s;///注意初始化
for(int j=0;j<n;j++){
if(!vis[j]&&low[j]<mi){
pos=j;
mi=low[j];
}
}
vis[pos]=1;
for(int j=0;j<n;j++){
if(!vis[j]&&low[pos]+t[pos][j]<low[j]) {
low[j]=low[pos]+t[pos][j];///更新时间的同时更新路径
ph[j]=ph[pos]+dis[pos][j];
p[j]=pos;
}
else if(!vis[j]&&low[pos]+t[pos][j]==low[j]){ ///时间相同选择路径最短的
if(ph[pos]+dis[pos][j]<ph[j]) {
ph[j]=ph[pos]+dis[pos][j];
p[j]=pos;
}
}
}
}
tim = low[e],ct2=0;
int tmp
;
tmp[ct2++]=e;
int k=e,j=0;
while(p[k]!=k){
k=p[k];
tmp[ct2++]=k;
}
for(int i=ct2-1;i>=0;i--)
rt2[j++]=tmp[i];
}

int main(){
while(cin>>n>>m){
memset(dis,inf,sizeof(dis));
memset(t,inf,sizeof(t));
for(int i=1;i<=m;i++) {
int a,b,c,d,e;
cin>>a>>b>>c>>d>>e;
if(!c) dis[a][b]=dis[b][a]=d,t[a][b]=t[b][a]=e;
else dis[a][b]=d,t[a][b]=e;
}
cin>>s>>e;
dij2();
dij1();
int flag=0;
for(int i=0;i<min(ct1,ct2);i++)
if(rt1[i]!=rt2[i]) flag=1;
if(!flag && ct1==ct2){
cout<<"Time = "<<tim<<"; Distance = "<<dt<<": ";
for(int i=0;i<ct1;i++)
if(i!=ct1-1) cout<<rt1[i]<<" => ";
else cout<<rt1[i]<<endl;
}else {
cout<<"Time = "<<tim<<": ";
for(int i=0;i<ct2;i++)
if(i!=ct2-1) cout<<rt2[i]<<" => ";
else cout<<rt2[i]<<endl;

a23c
cout<<"Distance = "<<dt<<": ";
for(int i=0;i<ct1;i++)
if(i!=ct1-1) cout<<rt1[i]<<" => ";
else cout<<rt1[i]<<endl;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: