Dijkstra 算法的变形
#include<stdio.h>
#include<stdlib.h>
#define Infinite (32765)
int rescue[505],map[505][505],distance[505],team[505],shortest[505],visit[505];
void Dijkstra(int s,int n){
//PriorityQueue q;
//q = Initialize(n+10);
int i,j,u,tmp;
for(i = 0;i<n;i++)
distance[i] = Infinite;
distance[s] = 0;
shortest[s] = 1;
team[s] = rescue[s];
for(i = 0;i<n;i++){
tmp = Infinite;
for(j = 0;j<n;j++){
if(!visit[j]&&distance[j]<tmp){
tmp = distance[j];
u = j;
}
}
visit[u] = 1;
for(j = 0;j<n;j++)
if(!visit[j]){
if(distance[u] + map[u][j]<distance[j]){
distance[j] = distance[u] + map[u][j];
team[j] = team[u] + rescue[j];
shortest[j] = shortest[u];
}
else if(distance[u] + map[u][j] == distance[j]){
shortest[j] = shortest[u] + shortest[j];
if(team[j] < rescue[j] + team[u])
team[j] = rescue[j] + team[u];
}
}
//if(tmp == Infinite)
//break;
}
}
int main(){
int s,d,road,v,i;
//FILE *fp;
//fp = fopen("1.in","r");
fscanf(stdin,"%d%d%d%d",&v,&road,&s,&d);
for(i = 0;i<v;i++)
fscanf(stdin,"%d",&rescue[i]);
int from,to,weight,j;
for(i = 0;i<v;i++)
for(j = 0;j<v;j++)
map[i][j] = Infinite;
for(i = 0;i<road;i++)
{
fscanf(stdin,"%d%d%d",&from,&to,&weight);
map[from][to] = weight;
map[to][from] = weight;
}
Dijkstra(s,v);
printf("%d %d\n",shortest[d],team[d]);
}