PAT 1003. 紧急情况
原题链接
中等
作者:
YAX_AC
,
2024-11-16 10:04:31
,
所有人可见
,
阅读 3
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 510;
int n,m;
int S,T;//起点,终点
int w[N];
int d[N][N],dist[N];
int cnt[N],sum[N];//cnt[u]:从起点到u点,有几种路径,sum[u]:u点的点权
bool st[N];
void dijstra()
{
memset(dist,0x3f,sizeof dist);
dist[S] = 0, cnt[S] = 1,sum[S] = w[S];
for(int i = 0; i<n; i++)
{
int t = -1;
for(int j = 0; j<n; j++)
if(!st[j] && (t==-1 || dist[t]>dist[j]))
t = j;
st[t] = true;//找到距离最小的的点t
//用t来更新其他点
for(int j = 0;j<n; j++)
if(dist[j] > dist[t] + d[t][j])
{
dist[j] = dist[t] + d[t][j];
cnt[j] = cnt[t];
sum[j] = sum[t] +w[j];
}
else if(dist[j] == dist[t] + d[t][j])//最短路不唯一
{
cnt[j] +=cnt[t];
sum[j] = max(sum[j],sum[t]+w[j]);//最短路径相同的情况下,找最大的点权
}
}
}
int main()
{
cin>>n>>m>>S>>T;
for(int i = 0; i<n; i++) cin>>w[i];
memset(d,0x3f,sizeof d);
while(m--)
{
int a,b,c;
cin>>a>>b>>c;
d[a][b] = d[b][a] = min(d[a][b],c);
}
dijstra();
cout<<cnt[T]<<' '<<sum[T]<<endl;
return 0;
}