#include<stdio.h>
#include<string.h>
#define INF 1<<10
int n,m,so,ta;
int cities[500+10][500+10];
int teams[500+10];
int dist[500+10];
int byPass[500+10];
int maxTeams[500+10];
int difDist[500+10];
bool visited[500+10];
int selectMin(int n)
{
int minCity=-1;
int minDis=INF;
for(int i=0;i<n;i++)
{
if(!visited[i]&&dist[i]<minDis)
{
minCity=i;
minDis=dist[i];
}
}
if(minCity==-1)return -1;
visited[minCity]=true;
for(int i=0;i<n;i++)
{
if(i!=minCity)
{
if(cities[minCity][i]!=INF&&cities[minCity][i]+dist[minCity]<dist[i])
{
dist[i]=cities[minCity][i]+dist[minCity];
difDist[i]=difDist[minCity];
maxTeams[i]=teams[i]+maxTeams[minCity];
byPass[i]=minCity;
}
else if(cities[minCity][i]!=INF&&cities[minCity][i]+dist[minCity]==dist[i])
{
difDist[i]+=difDist[minCity];
if(maxTeams[i]<teams[i]+maxTeams[minCity])maxTeams[i]=teams[i]+maxTeams[minCity];
}
}
}
return minCity;
}
void update(int minCity)
{
}
int main()
{
int cityOne,cityTwo,distance;
scanf("%d%d%d%d",&n,&m,&so,&ta);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
if(i==j)cities[i][j]=0;
else cities[i][j]=INF;
}
for(int i=0;i<n;i++)
{
scanf("%d",&teams[i]);
}
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&cityOne,&cityTwo,&distance);
cities[cityOne][cityTwo]=distance;
cities[cityTwo][cityOne]=distance;
}
for(int i=0;i<n;i++)
{
if(cities[so][i]!=INF&&cities[so][i]!=0)
{
dist[i]=cities[so][i];
byPass[i]=so;
maxTeams[i]=teams[so]+teams[i];
difDist[i]=1;
}else{
byPass[i]=-1;
maxTeams[i]=0;
dist[i]=cities[so][i];
difDist[i]=0;
}
visited[i]=false;
}
visited[so]=true;
difDist[so]=1;
maxTeams[so]=teams[so];
byPass[so]=so;
while(true)
{
int minDisCity=selectMin(n);
if(minDisCity==-1)break;
}
printf("%d %d",difDist[ta],maxTeams[ta]);
}
這題需要提一下的是:
1)核心步驟是Dijkstra算法。
2)增加兩個矩陣分別存放最短路徑的條數以及最大的teams。在更新dist矩陣的時候一併更新。