算法的写法
dist[i]数组中存放的是初始点到i点的最近的距离长度
g[i][j]存放稠密数组
st[i]判断是否找到了最短路
https://www.acwing.com/problem/content/description/1477/紧急救援的一个问题
#include<iostream>
#include<cstring>
using namespace std;
const int N = 600;
int g[N][N];
bool st[N];
int djist[N];
int num[N];//存每个城市的救援队的数量
int cet[N];//存路的条数
int tot[N];//存救援队的中收集人数
int n,m,c1,c2;
void dijistl()
{
memset(djist,0x3f,sizeof djist);
djist[c1] = 0;//初始化最重要
cet[c1] = 1;
tot[c1] = num[c1];
for(int i=0;i<n-1;i++)
{
int t=-1;//寻找还没有确定最小路径的最小的点
for(int j=0;j<n;j++)
{
if((!st[j])&&(t==-1||djist[j]<djist[t]))//属于循环着寻找最小距离 //(这里有一个写代码的易错点,不要将j写成i了)
{
t = j;
}
}
//更新最小距离
for(int j=0;j<n;j++)
{
if(djist[j]==djist[t]+g[t][j])
{
cet[j]+=cet[t];
if(tot[j]<(tot[t]+num[j]) ) tot[j]=tot[t]+num[j];
}
else if(djist[j]>(djist[t]+g[t][j]))
{
djist[j]=djist[t]+g[t][j];
cet[j]=cet[t];
tot[j]=tot[t]+num[j];
}
djist[j]=min(djist[j],djist[t]+g[t][j]);
}
//更新状态
st[t] = true;
}
}
int main()
{
cin>>n>>m>>c1>>c2;
for(int i=0;i<n;i++)
{
scanf("%d",&num[i]);
}
memset(g,0x3f,sizeof g);
int a,b,c;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
g[a][b] = g[b][a] =c;
}
dijistl();
cout<<cet[c2]<<" "<<tot[c2];
return 0;
}