#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <map>
using namespace std;
const int N = 550;
const int inf = 0x3f3f3f3f;
int room[N], G[N][N];
bool vis[N];
int n;
int path[N];
int dis[N];
void dij(int x)
{
int v;
memset(path, 0, sizeof(path));
memset(vis, 0, sizeof(vis));
for(int i=0; i<n; i++)
dis[i] = G[i][x];
path[x]=room[x];
vis[x] = 1;之前因为习惯就写上这个, 结果wrong了好久。
for(int i=0; i<n; i++)
{
int Min=inf;
for(int j=0; j<n; j++)
if(!vis[j]&&dis[j]<Min)
{
v=j;
Min=dis[j];
}
vis[v]=1;
for(int j=0; j<n; j++)
{
if(!vis[j]&&dis[j]>dis[v]+G[v][j])
{
dis[j]=dis[v]+G[v][j];
path[j]=path[v]+room[j];
}
else if(!vis[j]&&dis[j]==dis[v]+G[v][j])
{
path[j]=max(path[j],path[v]+room[j]);
}
}
}
}
int main()
{
int m, start, End, u, v, w;
while(~scanf("%d %d %d %d", &n, &m, &start, &End))
{
for(int i = 0 ; i < n; i++)
scanf("%d", &room[i]);
for(int i = 0; i<n; i++)
{
for(int j = i + 1 ; j<n; j++)
{
if(i==j)
G[i][j] = 0;
else
G[i][j] = G[j][i] = inf;
}
}
while(m--)
{
scanf("%d %d %d", &u, &v, &w);
G[u][v] = G[v][u] = w;
}
dij(start);
printf("%d %d\n", dis[End] , path[End]);
}
return 0;
}
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <map>
using namespace std;
const int N = 550;
const int inf = 0x3f3f3f3f;
int room[N], G[N][N];
bool vis[N];
int n;
int path[N];
int dis[N];
void dij(int x)
{
int v;
memset(path, 0, sizeof(path));
memset(vis, 0, sizeof(vis));
for(int i=0; i<n; i++)
dis[i] = G[i][x];
path[x]=room[x];
vis[x] = 1;之前因为习惯就写上这个, 结果wrong了好久。
for(int i=0; i<n; i++)
{
int Min=inf;
for(int j=0; j<n; j++)
if(!vis[j]&&dis[j]<Min)
{
v=j;
Min=dis[j];
}
vis[v]=1;
for(int j=0; j<n; j++)
{
if(!vis[j]&&dis[j]>dis[v]+G[v][j])
{
dis[j]=dis[v]+G[v][j];
path[j]=path[v]+room[j];
}
else if(!vis[j]&&dis[j]==dis[v]+G[v][j])
{
path[j]=max(path[j],path[v]+room[j]);
}
}
}
}
int main()
{
int m, start, End, u, v, w;
while(~scanf("%d %d %d %d", &n, &m, &start, &End))
{
for(int i = 0 ; i < n; i++)
scanf("%d", &room[i]);
for(int i = 0; i<n; i++)
{
for(int j = i + 1 ; j<n; j++)
{
if(i==j)
G[i][j] = 0;
else
G[i][j] = G[j][i] = inf;
}
}
while(m--)
{
scanf("%d %d %d", &u, &v, &w);
G[u][v] = G[v][u] = w;
}
dij(start);
printf("%d %d\n", dis[End] , path[End]);
}
return 0;
}