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\n",dxuemei[n]);
62     }
63     return 0;
64 }
View Code

 

posted @ 2013-10-04 13:18  Yours1103  阅读(328)  评论(0编辑  收藏  举报