SYN_1 2019-03-28 13:07 采纳率: 0%
浏览 970

有关Dijkstra算法的一道基础的编程题,不知道无法AC的原因

春游
春天阳光灿烂,小宋突然心血来潮想骑自行车去学校外面玩,但是到达目的地的路线不止一条,他想尽快的到达目的地,又能不需要骑太远的路, 你能帮助他吗?
输入格式:

输入包含一个测试数据,第一行有三个整数n(2 <= n <= 1000),途中可能经过的地点的个数,地点编号1~n;m(1 <= m <= 10000),为路径的条数;d(2 <= d <= n),目的地编号;其中学校为起点,默认为1。接下来m行: x y time dist , x y表示地点x,y是可以相互到达的,time,dist分别表示x到y或y到x的时间,距离。
输出格式:

按如下格式输出“花费的时间+空格+要骑的距离+空格+从学校到达目的地的路径”,路径中的两个地点之间以箭头(->)分隔。(具体见输出样例)
输入样例:

7 8 7
1 2 1 1
1 3 1 1
2 4 1 2
3 4 1 1
4 5 1 2
4 6 1 1
5 7 1 1
6 7 2 1

输出样例:

4 5 1->3->4->5->7
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;

#define INF 100000 
int n;
int tu[1005][1005];
int len[1005][1005];
int vist[1005];
int tim[1005];
int dist[1005];
int path[1005];

void dijkstra(){
    while(1){
        int min=INF,x=-1;
        for(int i=1;i<n+1;i++){
            if(vist[i]!=1&&tim[i]<min){
                min=tim[i];
                x=i;
            }
        }
        if(x==-1) break;
        vist[x]=1;

        for(int i=1;i<n+1;i++){
            if(vist[i]||!tu[x][i]) continue;
            if(tim[i]>tim[x]+tu[x][i]){
                tim[i]=tim[x]+tu[x][i];
                dist[i]=dist[x]+len[x][i];
                path[i]=x;
            }
            else if(tim[i]==tim[x]+tu[x][i]){
                if(dist[i]>dist[x]+len[x][i]){
                    dist[i]=dist[x]+len[x][i];
                    path[i]=x;
                }
            }
        }
    }

}

int main(){

    int m;int end;
    cin>>n>>m>>end;
    while(m--){
        int a,b,c,d;
        cin>>a>>b>>c>>d;
        tu[a][b]=c;tu[b][a]=c;
        len[a][b]=d;len[b][a]=d;
    }

    fill(tim,tim+1005,INF);
    fill(dist,dist+1005,INF);
    fill(path,path+1005,-1);
    tim[1]=0;dist[1]=0;
    dijkstra();

    cout<<tim[end]<<" "<<dist[end]<<" ";

    int f[n];int k=1;f[0]=end;
    while(path[end]!=-1){
        end=path[end];
        f[k++]=end;
    }

    int flag=0;
    while(k--) {
        if(flag)printf("->");
        printf("%d",f[k]);
        flag=1;
    }   
}

oj的结果是
图片说明

  • 写回答

1条回答 默认 最新

  • Archer- 2020-09-26 14:06
    关注

    应该是算两者的字典序最小吧

    评论

报告相同问题?

悬赏问题

  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料