CX是要趕去上課,爲了避免遲到必需要以最短的路徑到達教室,同時CX但願通過的路上能看到的學妹越多越好。如今把地圖抽象成一個無向圖,CX從1點出發,教室在N號點,告訴每一個點上學妹的數量,每條邊的長度。請你求出CX以最短路徑趕到教室最多能看到多少學妹。ios
CX是要趕去上課,爲了避免遲到必需要以最短的路徑到達教室,同時CX但願通過的路上能看到的學妹越多越好。如今把地圖抽象成一個無向圖,CX從1點出發,教室在N號點,告訴每一個點上學妹的數量,每條邊的長度。請你求出CX以最短路徑趕到教室最多能看到多少學妹。ios
多組輸入數據(最多20組),輸入到文件結束。算法
每組數據第一行兩個正整數N,M其中N表明點的個數(2<=N<=1000),M表明邊的個數(1<=M<=10000)。spa
接下來一行N個數,表明着1~N每一個點上學妹的個數,(0<=Ni<=50)。 接下來M行,每行三個數A B C(1<=A,B<=N,0<c<=100)表明A,B間有邊,長度爲C。(可能存在重邊)ip
輸出CX以最短距離從1到n的狀況下能看到的最多學妹數量,若從點1沒法到達點N輸出-1。string
4 4 1 2 3 4 1 2 1 1 3 1 2 4 2 3 4 2
8 題意:給定一個起點求一條到終點的最短的路是的看到的妹子數最多題解:最短路最小或最大費用問題,djkstra算法求解#include<stdio.h>#include<iostream>#include<string.h>#define MAX 10000000using 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;}