• HDU3790 最短路径问题


     1 #include<stdio.h>
     2 #include<string.h>
     3 #define MAX 0x7ffffff
     4 struct G {
     5     int d;
     6     int p;
     7 }map[1001][1001];
     8 struct D {
     9     int d;
    10     int p;
    11 }dist[1001];
    12 bool vis[1001];
    13 int m,n,s,e;
    14 void dijkstra()
    15 {
    16     int i,j,k,min;
    17     for(i=1;i<n;i++){
    18         for(min=MAX,j=1;j<=n;j++){
    19             if(!vis[j]&&min>dist[j].d){
    20                 min=dist[j].d;
    21                 k=j;
    22             }
    23         }
    24         vis[k]=1;
    25         for(j=1;j<=n;j++){
    26             if(!vis[j]){
    27                 if(dist[j].d>dist[k].d+map[k][j].d){
    28                     dist[j].d=dist[k].d+map[k][j].d;
    29                     dist[j].p=dist[k].p+map[k][j].p;
    30                 }else if(dist[j].d==dist[k].d+map[k][j].d&&dist[j].p>dist[k].p+map[k][j].p){
    31                     dist[j].p=dist[k].p+map[k][j].p;
    32                 }
    33             }
    34         }
    35     }
    36     printf("%d %d\n",dist[e].d,dist[e].p);
    37 }
    38 void init()
    39 {
    40     int i,j;
    41     int a,b,d,p;
    42     for(i=1;i<=n;i++){
    43         for(j=1;j<=n;j++){
    44             map[i][j].d=map[j][i].d=MAX;
    45             map[i][j].p=map[j][i].p=MAX;
    46         }
    47         map[i][i].d=map[i][i].p=0;
    48     }
    49     for(i=0;i<m;i++) {
    50         scanf("%d%d%d%d",&a,&b,&d,&p);
    51         if(map[a][b].d>d){
    52             map[a][b].d=map[b][a].d=d;
    53             map[a][b].p=map[b][a].p=p;
    54         }else if(map[a][b].d==d&&map[a][b].p>p){
    55             map[a][b].p=map[b][a].p=p;
    56         }
    57     }
    58     scanf("%d%d",&s,&e);
    59     for(i=1;i<=n;i++){
    60         dist[i].d=map[s][i].d;
    61         dist[i].p=map[s][i].p;
    62     }
    63     memset(vis,0,sizeof(vis));
    64     vis[s]=1;
    65     dist[s].d=dist[s].p=0;
    66 } 
    67 int main()
    68 {
    69     while(scanf("%d%d",&n,&m),n||m){
    70         init();
    71         dijkstra();
    72     }
    73     return 0;
    74 } 

    我用dijkstra做的,还可以用其他方法去做!如:SPFA

  • 相关阅读:
    管理软件数据库备份策略
    融云群组同步策略
    Nginx中配置undertow进行两个项目的动静分离配置
    记录mysql正在执行的SQL语句
    RabbitMQ启动出现的问题与解决办法
    延迟任务的实现总结
    查找所有sphinx引擎表并生成创建表的语句
    go 学习笔记(4) --变量与常量
    go 学习笔记(4) import
    go 学习笔记(4) package
  • 原文地址:https://www.cnblogs.com/shihuajie/p/2798036.html
Copyright © 2020-2023  润新知