算法之最优路径变形
#include<iostream>
#include<stdio.h>
#define MAX 1000000
using namespace std;
int main()
{
int N,M,c1,c2,i,j,k,d;
int data[500][500],savemen[500],num[500],team[500];
cin>>N>>M>>c1>>c2;
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
data[i][j]=MAX;
if(i==j)
data[i][j]=0;
}
}
for(i=0;i<N;i++)
cin>>savemen[i];
for(i=0;i<M;i++)
{
cin>>j>>k>>d;
data[k][j]=data[j][k]=d;
}
bool s[500];
int dist[500];
for(i=0;i<N;i++)
{
s[i]=false;
dist[i]=data[c1][i];
if(i==c1)
{
num[c1]=1;
team[c1]=savemen[c1];
}
else
{
num[i]=0;
team[i]=0;
}
}
int c=-1;
while(c!=c2)
{
d=MAX;
for(i=0;i<N;i++)
{
if(s[i]==true)
continue;
if(dist[i]<d)
{
j=i;
d=dist[i];
}
}
s[j]=true;
c=j;
for(i=0;i<N;i++)
{
if(s[i]==true)
continue;
if(dist[i]>dist[c]+data[c][i])
{
dist[i]=dist[c]+data[c][i];
num[i]=num[c];
team[i]=team[c]+savemen[i];
}
else if(dist[i]==dist[c]+data[c][i])
{
num[i]=num[i]+num[c];
if(team[i]<team[c]+savemen[i])
team[i]=team[c]+savemen[i];
}
}
}
cout<<num[c2]<<" "<<team[c2]<<endl;
return 0;
}