输入样例:
5 6 0 2
1 2 1 5 3
0 1 1
0 2 2
0 3 1
1 2 1
2 4 1
3 4 1
输出样例:
2 4
难度:中等 |
时/空限制:0.4s / 64MB |
总通过数:2316 |
总尝试数:4819 |
来源:PAT甲级真题1003 |
算法标签 |
#include<bits/stdc++.h>
using namespace std;
const int N=510;
int n,m,c1,c2;
int num[N];
int d[N],s[N];
int g[N][N];
int sum[N];
bool st[N];
int dijk(int c1,int c2)
{
memset(d,0x3f,sizeof d);
d[c1]=0;
s[c1]=num[c1];
sum[c1]=1;//初始化!!!
for(int i=0;i<n;i++)
{
int t=-1;
for(int j=0;j<n;j++){
if(!st[j]&&(t==-1||d[t]>d[j])) t=j;
}
st[t]=1;
for(int j=0;j<n;j++)
{
if(d[j]==d[t]+g[t][j])
{
s[j]=max(s[j],s[t]+num[j]);
sum[j]=sum[j]+sum[t];
}
if(d[j]>d[t]+g[t][j]){
d[j]=d[t]+g[t][j];
s[j]=s[t]+num[j];
sum[j]=sum[t];
}
}
}
return s[c2];
}
int main()
{
scanf("%d %d %d %d",&n,&m,&c1,&c2);
for(int i=0;i<n;i++) cin>>num[i];
memset(g,0x3f,sizeof g);
while(m--)
{
int a,b,c;
cin>>a>>b>>c;
g[a][b]=g[b][a]=min(g[a][b],c);
}
int t=dijk(c1,c2);
cout<<sum[c2]<<" "<<t<<endl;
return 0;
}