zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    [PATCH] input: add driver for Bosch Sensortec's BMA150 accelerometer
    linux内核GPIO模拟I2C实例
    修改默认apn数据的方法
    Android平台开发WIFI function portingWIFI功能移植
    Silverlight中后台获取样式的方法
    Silverlight中读取Word
    Silverlight找到模板中的子控件
    根据年月来获取该年该月的天数
    Silverlight中Treeview中判断当前节点是否含有父节点
    修改 Linux /etc/profile 以后如何生效
  • 原文地址:https://www.cnblogs.com/yours1103/p/3351444.html
Copyright © 2011-2022 走看看