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
  • 相关阅读:
    IO 单个文件的多线程拷贝
    day30 进程 同步 异步 阻塞 非阻塞 并发 并行 创建进程 守护进程 僵尸进程与孤儿进程 互斥锁
    day31 进程间通讯,线程
    d29天 上传电影练习 UDP使用 ScketServer模块
    d28 scoket套接字 struct模块
    d27网络编程
    d24 反射,元类
    d23 多态,oop中常用的内置函数 类中常用内置函数
    d22 封装 property装饰器 接口 抽象类 鸭子类型
    d21天 继承
  • 原文地址:https://www.cnblogs.com/yours1103/p/3351444.html
Copyright © 2011-2022 走看看