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

题意:给定一个起点求一条到终点的最短的路是的看到的妹子数最多
题解:最短路最小或最大费用问题,djkstra算法求解
#include<stdio.h>
#include<iostream>
#include<string.h>
#define MAX 10000000
using namespace std;
int p[1005][1005];
int flag[1005][1005];
int visit[1005];
int des[1005];
int num[1005];
int ori[1005];
int n,m;
int dijstra(int sr)
{
 int i,j,pos;
 memset(visit,0,sizeof(visit));
 for(i=1;i<=n;i++) des[i]=MAX;
 for(i=1;i<=n;i++) num[i]=0;
 des[sr]=0;
 num[sr]=ori[sr];
    for(i=1;i<=n;i++)
 {
  int temp=10000000;
  for(j=1;j<=n;j++)
  {
            if(visit[j]==0&&des[j]<temp)
   {
    temp=des[j];
    pos=j;
   }
  }
  if(temp==10000000) break;
        visit[pos]=1;
        for(j=1;j<=n;j++)
  {
   if(visit[j]==0)
   {
    if(des[pos]+p[pos][j]<des[j]) {des[j]=des[pos]+p[pos][j];num[j]=num[pos]+flag[pos][j];}
    else if(des[pos]+p[pos][j]==des[j])//距离一样时,选择妹子数多的
    {
     if(num[pos]+flag[pos][j]>num[j]) num[j]=num[pos]+flag[pos][j];
    }
   }
  }
 }
    if(des[n]==MAX) return -1;
 else return num[n];
}
int main()
{
 int i,a,b,c;
 while(scanf("%d %d",&n,&m)!=EOF)
 {
       for(i=1;i<=n;i++) scanf("%d",&ori[i]);
    memset(p,127,sizeof(p));
    memset(flag,0,sizeof(flag));
       for(i=0;i<m;i++)
    {
          scanf("%d %d %d",&a,&b,&c);
    if(p[a][b]>c) {p[a][b]=c;p[b][a]=c;flag[a][b]=ori[b];flag[b][a]=ori[a];}
    }
       printf("%d\n",dijstra(1));
 }
 return 0;
}
posted @ 2013-10-06 17:38  forevermemory  阅读(291)  评论(0编辑  收藏  举报