博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
L3-007 天梯地图 (30分)
阅读量:3948 次
发布时间:2019-05-24

本文共 3799 字,大约阅读时间需要 12 分钟。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
想了一晚上,不知道为什么第三个点过不了,希望有大佬能给予帮助

#include
using namespace std;const int maxn=507;const int maxm=300007;int n,m;int s,e;int cnt,head[maxn];int vis[maxn],dis[maxn],span[maxn],pred[maxn],pret[maxn],step[maxn];int ans1[maxn],ans2[maxn],cnt1,cnt2;struct node{
int to; int next; int cost; int time;}edge[maxm];void add(int x,int y,int z,int t){
edge[++cnt].to=y; edge[cnt].next=head[x]; edge[cnt].cost=z; edge[cnt].time=t; head[x]=cnt;}void dij(int start){
memset(dis,0x3f,sizeof(dis)); memset(span,0x3f,sizeof(span)); memset(step,0x3f,sizeof(step)); vis[start]=1; dis[start]=0; span[start]=0; step[start]=0; for(int i=head[start];i;i=edge[i].next) {
int v=edge[i].to; if(dis[v]>dis[start]+edge[i].cost||(dis[v]==dis[start]+edge[i].cost&&step[v]>step[start]+1)) {
step[v]=step[start]+1; dis[v]=dis[start]+edge[i].cost; pred[v]=start; } if(span[v]>span[start]+edge[i].time||(span[v]==span[start]+edge[i].time&&dis[v]>dis[start]+edge[i].cost)) {
span[v]=span[start]+edge[i].time; pret[v]=start; } } /* queue
q; q.push(start); step[start]=0; while(!q.empty()) { int u=q.front(); q.pop(); vis[u]=0; for(int i=head[u];i;i=edge[i].next) { int v=edge[i].to; if(dis[v]>dis[u]+edge[i].cost||(dis[v]==dis[u]+edge[i].cost&&step[v]>step[u]+1)) { step[v]=step[u]+1; dis[v]=dis[u]+edge[i].cost; pred[v]=u; if(!vis[v]) { q.push(v); vis[v]=1; } } } }*/ while(1) {
int mi=10000000,flag=-1; for(int i=1;i<=n;i++) {
if(dis[i]
dis[flag]+edge[i].cost||(dis[v]==dis[flag]+edge[i].cost&&step[v]>step[flag]+1)) {
step[v]=step[flag]+1; dis[v]=dis[flag]+edge[i].cost; pred[v]=flag; } } } memset(vis,0,sizeof(vis)); vis[start]=1; while(1) {
int mi=10000000,flag=-1; for(int i=1;i<=n;i++) {
if(span[i]
span[flag]+edge[i].time||(span[v]==span[flag]+edge[i].time&&dis[v]>dis[flag]+edge[i].cost)) {
span[v]=span[flag]+edge[i].time; pret[v]=flag; } } }}void print(int cur){
if(cur==0) return ; print(pret[cur]); ans1[++cnt1]=cur; //printf("%d => ",cur);}void prind(int cur){
if(cur==0) return; prind(pred[cur]); ans2[++cnt2]=cur; //printf("%d => ",cur);}int main(){
int a,b,c,d,e; scanf("%d%d",&n,&m); while(m--) {
cin>>a>>b>>c>>d>>e; add(a,b,d,e); if(c==0) add(b,a,d,e); } cin>>s>>e; dij(s); //printf("Time = %d: ",span[e]); print(pret[e]); //printf("%d\n",e); //printf("Distance = %d: ",dis[e]); prind(pred[e]); //printf("%d\n",e); int flag=0; if(cnt1==cnt2) {
int i; for(i=1;i<=cnt1;i++) {
if(ans1[i]!=ans2[i]) {
break; } } if(i==cnt1+1) flag=1; } if(flag==1) {
printf("Time = %d; Distance = %d: ",span[e],dis[e]); for(int i=1;i<=cnt1;i++) printf("%d => ",ans1[i]); printf("%d\n",e); } else {
printf("Time = %d: ",span[e]); for(int i=1;i<=cnt1;i++) printf("%d => ",ans1[i]); printf("%d\n",e); printf("Distance = %d: ",dis[e]); for(int i=1;i<=cnt2;i++) printf("%d => ",ans2[i]); printf("%d\n",e); } return 0;}

转载地址:http://lsgwi.baihongyu.com/

你可能感兴趣的文章
Android判断网络状态方法详解
查看>>
在Android上实现Junit单元测试的四部曲
查看>>
有效控制Android应用程序的耗电量
查看>>
Android术语列表概览
查看>>
全方位解读Android多媒体框架源码
查看>>
Android音乐编程的管理音频硬件
查看>>
Android UI控件组合应用之一:建立数据模型
查看>>
避免Andriod平台图片失真的图片形式
查看>>
Android之Gridview图片列表
查看>>
objdump的使用方法
查看>>
编译错误处理noproguard.classes-with-local.dex已杀死
查看>>
LTE - CSFB技术
查看>>
GSM链路层信令协议
查看>>
技术道德
查看>>
“需求为王”才是根本
查看>>
高效率的危害
查看>>
寻找边缘性创新
查看>>
让创意瞄准市场
查看>>
高效经理人应具有的八个重要习惯
查看>>
优秀的领导者能读懂人才
查看>>