1111. Online Map (30)

dijkstra算法,增加一个判断最短路径条件,即相同距离增加一个时间判断,相同时间增加一个计数cnt判断,只需编写一个dijkstra函数,传递参数即可,每确定一个最短路径,记录该点的上一个位置,最后输出时用栈输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <cstdio>
#define INF 999999999
int n,m,d,s;
int len[500][500],dist[500],dlast[500];
int tm[500][500],time[500],tlast[500];
bool visited[500];
void dijkstra(int mp1[][500],int mp2[][500],int d1[],int last[]){  //d1[]为第一个判断条件,last[]为上一步
  int d2[500];  //d2[]为第二个判断条件
  for(int i=0;i<n;i++) visited[i]=false;
  for(int i=0;i<n;i++){
    d1[i]=mp1[s][i];
    last[i]=s;
    d2[i]=mp2[s][i];
  }
  visited[s]=true;d1[s]=0;d2[s]=0;
  int v=s;
  while(v!=d){
    int min=INF;
    for(int i=0;i<n;i++)
      if(!visited[i] && d1[i]<min){
        v=i;
        min=d1[i];
      }
    visited[v]=true;
    for(int i=0;i<n;i++)
      if(!visited[i]){
        if(d1[v]+mp1[v][i]<d1[i]){
          d1[i]=d1[v]+mp1[v][i];
          d2[i]=d2[v]+mp2[v][i];
          last[i]=v;
        }
        else if(d1[v]+mp1[v][i]==d1[i] && d2[v]+mp2[v][i]<d2[i]){
          d2[i]=d2[v]+mp2[v][i];
          last[i]=v;
        }
      }
  }
}
void output(int *last){
  int step[500],pos=0;
  for(int i=d;i!=s;i=last[i],pos++)
    step[pos]=i;
  for(int i=pos-1;i>=0;i--)
    printf(" -> %d",step[i]);
  printf("\n");
}
int main(){
  scanf("%d%d",&n,&m);
  for(int i=0;i<n;i++)
    for(int j=0;j<n;j++)
      len[i][j]=tm[i][j]=INF;
  for(int i=0;i<m;i++){
    int v1,v2,oneway;
    scanf("%d%d",&v1,&v2);
    scanf("%d%d%d",&oneway,&len[v1][v2],&tm[v1][v2]);
    if(!oneway){
      len[v2][v1]=len[v1][v2];
      tm[v2][v1]=tm[v1][v2];
    }
  }
  scanf("%d%d",&s,&d);
  if(s==d) printf("Distance = 0; Time = 0: %d -> %d",s,d);
  dijkstra(len,tm,dist,dlast);
  int cnt[500][500];
  for(int i=0;i<n;i++)
    for(int j=0;j<n;j++)
      cnt[i][j]=1;
  dijkstra(tm,cnt,time,tlast);
  bool identical=true;
  for(int i=d;i!=s && identical;i=dlast[i])
    if(dlast[i]!=tlast[i]){
      identical=false;
    }
  if(identical){
    printf("Distance = %d; Time = %d: %d",dist[d],time[d],s);
    output(dlast);
  }
  else{
    printf("Distance = %d: %d",dist[d],s);
    output(dlast);
    printf("Time = %d: %d",time[d],s);
    output(tlast);
  }
  return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值