• csu 10月 月赛 D 题 CX and girls


    Description

      CX是要赶去上课,为了不迟到必须要以最短的路径到达教室,同时CX希望经过的路上能看到的学妹越多越好。现在把地图抽象成一个无向图,CX从1点出发,教室在N号点,告诉每个点上学妹的数量,每条边的长度。请你求出CX以最短路径赶到教室最多能看到多少学妹。

    Input

      多组输入数据(最多20组),输入到文件结束。

      每组数据第一行两个正整数N,M其中N代表点的个数(2<=N<=1000),M代表边的个数(1<=M<=10000)。

      接下来一行N个数,代表着1~N每个点上学妹的个数,(0<=Ni<=50)。 接下来M行,每行三个数A B C(1<=A,B<=N,0<c<=100)代表A,B间有边,长度为C。(可能存在重边)

    Output

      输出CX以最短距离从1到n的情况下能看到的最多学妹数量,若从点1无法到达点N输出-1。

    Sample Input

    4 4 1 2 3 4 1 2 1 1 3 1 2 4 2 3 4 2

    Sample Output

    8

    HINT

    CSU_ZZY

    Source

    CSU Monthly 2013 Oct.

    最短路的题;

    每次找到距离最小的点,如果有多个点,找到学妹最多的那个;

    松弛的时候,将接下来的点的路径变短,如果路径相同,增加学妹的数量;

    代码:

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 #define maxn 1005
     5 #define inf 10000000
     6 using namespace std;
     7 
     8 int xuemei[maxn],map[maxn][maxn],d[maxn],dxuemei[maxn];
     9 bool vis[maxn];
    10 
    11 int main()
    12 {
    13 //    freopen("new.txt","r",stdin);
    14     int n,m,dd,x,y;
    15     while(scanf("%d%d",&n,&m)!=EOF)
    16     {
    17         for(int i=1; i<=n; i++)scanf("%d",&xuemei[i]);
    18         memset(map,0x1f,sizeof map);
    19         for(int i=1; i<=m; i++)
    20         {
    21             scanf("%d%d%d",&x,&y,&dd);
    22             if(dd>map[x][y])continue;
    23             map[x][y]=dd;
    24             map[y][x]=dd;
    25         }
    26         memset(vis,0,sizeof vis);
    27         for(int i=1; i<=n; i++)
    28         {
    29             d[i]=(i==1?0:inf);
    30             dxuemei[i]=(i==1?xuemei[1]:0);
    31         }
    32         for(int i=1; i<=n; i++)
    33         {
    34             y=inf;
    35             int t=0;
    36             for(int j=1; j<=n; j++)
    37                 if(!vis[j]&&d[j]<y)
    38                 {
    39                     x=j;
    40                     y=d[j];
    41                     t=dxuemei[j];
    42                 }
    43                 else if(!vis[j]&&d[j]==y&&dxuemei[j]>=t)
    44                 {
    45                     x=j;
    46                     y=d[j];
    47                     t=dxuemei[j];
    48                 }
    49             vis[x]=1;
    50             for(int j=1; j<=n; j++)
    51                 if(d[j]>d[x]+map[x][j])
    52                 {
    53                     d[j]=d[x]+map[x][j];
    54                     dxuemei[j]=dxuemei[x]+xuemei[j];
    55                 }
    56                 else if(d[j]==d[x]+map[x][j])
    57                     dxuemei[j]=max(dxuemei[j],dxuemei[x]+xuemei[j]);
    58         }
    59         if(d[n]==inf)puts("-1");
    60 
    61         else printf("%d
    ",dxuemei[n]);
    62     }
    63     return 0;
    64 }
    View Code
  • 相关阅读:
    网线帘幕动画
    图片缩放/旋转/平移/设置分辨率
    贝塞尔样条
    线性梯度画刷
    画七彩五角星
    kafka安装
    在windows远程提交任务给Hadoop集群(Hadoop 2.6)
    把Spark SQL的metadata存储到mysql
    使用IDEA开发SPARK提交remote cluster执行
    Netty的Channel
  • 原文地址:https://www.cnblogs.com/yours1103/p/3351444.html
Copyright © 2020-2023  润新知