#include<iostream>
using namespace std;
#define mmax 10000
int dis[500][500];
int eachnum[500],visited[500],tempdis[500],num[500],count[500];
//num用来表示什么呢?用来表示包括这个城市在内路径上的救护队数量
int main()
{
int n,m,c1,c2,node1,node2,len;
cin>>n>>m>>c1>>c2;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
dis[i][j] = mmax;
for(int i=0;i<n;i++)
{
cin>>eachnum[i];
}
for(int i=0;i<m;i++)
{
cin>>node1>>node2>>len;
dis[node1][node2] = len;
dis[node2][node1] = len;
}
for(int i=0;i<n;i++)
{
tempdis[i] = dis[c1][i];
visited[i] = 0;
count[i]=0;
if(tempdis[i]!=mmax){
num[i] = eachnum[c1]+eachnum[i]; //如果这两个城市是直接相连的,则这两个
count[i]=1;//城市的救护车就拿到了 //x直连的路最起码是有一个畅通的
}
else num[i] = eachnum[c1]; //否则一个车都没有
}
//只求两点的距离
visited[c1] =1;
tempdis[c1] = 0;
num[c1] = eachnum[c1];
count[c1] =1;
for(int i=1;i<n;i++)//还需要n-1个点
{
int min = mmax,tempnode = -1;
for(int j=0;j<n;j++)
{
if(visited[j]==0&&tempdis[j]!=mmax)
{
if(tempdis[j]<min) min = tempdis[j],tempnode=j;
}
}
visited[tempnode]=1;
//对别的点进行更新。
if(tempnode!=-1)
{
for(int j=0;j<n;j++)
{
if(visited[j]==0&&dis[tempnode][j]!=mmax)
{
int temp = tempdis[tempnode]+dis[tempnode][j];
if(tempdis[j]>temp)
{
count[j] = count[tempnode];
tempdis[j] =temp;
num[j] = num[tempnode]+eachnum[j];
}else if(tempdis[j]==temp) //两者相等,条数就要增加
{
count[j] +=count[tempnode];
if(num[j]<num[tempnode]+eachnum[j])
num[j] = num[tempnode]+eachnum[j];
}
}
}
}
}
cout<<count[c2]<<" "<<num[c2]<<endl;
}
在做这道题的时候存在三个问题:
1、首先审题不清,不清楚第一个输出的含义是什么,误以为是最短路径的长度,其实是最短路径的数量;
2、初始化的时候竟然忘记这是一个完全图
3、再者路径条数的更新方法不明确,竟然直接加1, 脑子是被僵尸吃掉了吗,应该是加上count[lastnode];