• CodeVS 1557 热浪


    德克萨斯纯朴的民眾们这个夏天正在遭受巨大的热浪!!!他们的德克萨斯长角牛吃起来不错,可是他们并不是很擅长生產富含奶油的乳製品。Farmer John此时以先天下之忧而忧,后天下之乐而乐的精神,身先士卒地承担起向德克萨斯运送大量的营养冰凉的牛奶的重任,以减轻德克萨斯人忍受酷暑的痛苦。

    FJ已经研究过可以把牛奶从威斯康星运送到德克萨斯州的路线。这些路线包括起始点和终点先一共经过T (1 <= T <= 2,500)个城镇,方便地标号為1T。除了起点和终点外地每个城镇由两条双向道路连向至少两个其它地城镇。每条道路有一个通过费用(包括油费,过路费等等)。

    给定一个地图,包含C (1 <= C <= 6,200)条直接连接2个城镇的道路。每条道路由道路的起点Rs,终点Re (1 <= Rs <= T; 1 <= Re <= T),和花费(1 <= Ci <= 1,000)组成。求从起始的城镇Ts (1 <= Ts <= T)到终点的城镇Te(1 <= Te <= T)最小的总费用。

    这题就用dijkstra啦,AC的同时也明白的dijkstra算法的含义。

    变量功能如其名,方便新手一起学习学习

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <string.h>
     4 #define MAX 1000000 
     5 int map[2501][2501];//前一维代表起始点,后一维代表终止点 
     6 int pointsPassed[2501],shortestDist[2501];
     7 int T,C,Ts,Te;//T=城镇数 C=道路数 Ts=起始镇 Te=结束镇 
     8 int Rs,Re,Ci;
     9 
    10 int main()
    11 {
    12     int i,j,nowMinDist,toPoint;
    13     scanf("%d%d%d%d",&T,&C,&Ts,&Te);
    14     
    15     for(i=1;i<=T;i++)
    16         for(j=1;j<=T;j++)
    17             map[i][j]=MAX;
    18             
    19     for(i=1;i<=C;i++) 
    20     {
    21         scanf("%d%d%d",&Rs,&Re,&Ci);
    22         if(Ci<=map[Rs][Re])//根据输入可能会有更便宜的路 
    23         {
    24             map[Rs][Re]=Ci;
    25             map[Re][Rs]=Ci;
    26         }
    27     }
    28     map[Ts][Ts]=0;
    29     
    30     for(i=1;i<=T;i++) //初始化 
    31     {
    32         shortestDist[i]=map[Ts][i];    
    33         pointsPassed[i]=0;
    34     }
    35     pointsPassed[Ts]=1;
    36     
    37     for(i=2;i<=T;i++)
    38     {
    39         nowMinDist=MAX; 
    40         toPoint=Ts;//每一次都从出发点找与其距离最短的未经过点 
    41                    //现在只是已知到这个点的最短路径而已 
    42                       
    43         for(j=1;j<=T;j++)
    44             if((!pointsPassed[j]) && shortestDist[j]<nowMinDist) 
    45             {
    46                 toPoint=j; 
    47                 nowMinDist=shortestDist[j];
    48             }
    49         
    50         //收录此点
    51         pointsPassed[toPoint]=1;
    52         for(j=1;j<=T;j++)
    53             if((!pointsPassed[j]) && map[toPoint][j]!=MAX)//从这个点扩展出向外的点 
    54                  if(shortestDist[toPoint] + map[toPoint][j] < shortestDist[j])
    55                        shortestDist[j]=shortestDist[toPoint] + map[toPoint][j];
    56     } 
    57     
    58     printf("%d",shortestDist[Te]);
    59     return 0;
    60 }
  • 相关阅读:
    ORA-01861: 文字与格式字符串不匹配
    Tomcat启动失败Unrecognized Windows Sockets error: 0: JVM_Bind
    登陆数据库,界面一直保持正在登陆的状态,oracle使用界面无法登陆
    java.sql.SQLException: 关闭的连接
    如何提高家庭宽带的网速?
    打爆IPv4的不一定是IPv6,可能是中国互联网!
    LibreOffice 7.0.1 发布,开源办公套件
    iPhone12系列售价曝光
    TikTok正式起诉特朗普政府
    WordPress主题ripro 6.6
  • 原文地址:https://www.cnblogs.com/KakagouLT/p/4868359.html
Copyright © 2020-2023  润新知