#include <cstdio>
#include <cstdlib>
#include <map>
#include <iostream>
#include <string>
#include <vector>
#include <queue>
using namespace std;
const int maxn=510;
const int inf=100000000;
int team[maxn],w[maxn];
int G[maxn][maxn];
int N,M,now,save;
bool vis[maxn]={false};
int pre[maxn];
int d[maxn];
int num[maxn];
void Dij(int s)
{
fill(d,d+maxn,inf);
for(int i=0;i<N;i++)
{
pre[i]=i;
}
d[s]=0;
fill(w,w+maxn,0);
w[s]=team[s];
fill(num,num+maxn,0);
num[s]=1;
for(int i=0;i<N;i++)
{
int u=-1,MIN=inf;
for(int j=0;j<N;j++)
{
if(vis[j]==false&&d[j]<MIN)
{
u=j;
MIN=d[j];
}
}
if(u==-1)return;
vis[u]=true;
for(int v=0;v<N;v++)
{
if(vis[v]==false&&G[u][v]!=inf)
{
if(d[u]+G[u][v]<d[v])
{
d[v]=d[u]+G[u][v];
num[v]=num[u];
w[v]=w[u]+team[v];
}
else if(d[u]+G[u][v]==d[v])
{
num[v]+=num[u];
if(w[v]<w[u]+team[v])
{
w[v]=w[u]+team[v];
}
}
}
}
}
}
int main()
{
fill(G[0],G[0]+maxn*maxn,inf);
scanf("%d%d%d%d",&N,&M,&now,&save);
for(int i=0;i<N;i++)
{
scanf("%d",&team[i]);
}
for(int i=0;i<M;i++)
{
int c1,c2,v;
scanf("%d%d%d",&c1,&c2,&v);
G[c1][c2]=v;
G[c2][c1]=v;
}
Dij(now);
printf("%d %d",num[save],w[save]);
system("pause");
return 0;
}
PAT甲1003. Emergency (25)
猜你喜欢
转载自blog.csdn.net/yhy489275918/article/details/80231937
今日推荐
周排行