#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <stack>
#include <queue>
#include <set>
#include <map>
using namespace std;
const int maxn = 2010;
const int INF = 0x3ffffff;
struct node
{
int v;
int edge;
};
int weight[maxn] = {0};
vector<node> A[maxn];
int n,m,c1,c2;
int d[maxn];
bool vist[maxn] = {false};
int num[maxn] = {0};
int w[maxn] = {0};
void Dijkstra()
{
// vist[c1] = true;
w[c1] = weight[c1];
fill(d,d+n,INF);
fill(num,num+n,0);
num[c1] = 1;
d[c1] = 0; //到自己的距离为0
for(int i = 0;i<n;i++)
{
int u = - 1,MIN = INF; //设置最小值和当前节点
for(int j = 0;j < n;j++) //找到最小距离的点
{
if(d[j]<MIN && vist[j] == false) //如果距离小于最小距离,更新
{
MIN = d[j];
u = j;
// num[j] = 1;
}
}
if(u == -1) return; //如果找不到,则不连通推出
vist[u] = true;
for(int j = 0;j<A[u].size();j++)
{
int v = A[u][j].v;
if(vist[v] == false)
{
if(d[v] > d[u] + A[u][j].edge)
{
d[v] = d[u] + A[u][j].edge;
w[v] = w[u] + weight[v];
num[v] = num[u];
}
else if(d[v] == d[u] + A[u][j].edge)
{
if(w[v] < w[u] + weight[v])
w[v] = w[u] + weight[v];
num[v] += num[u];
}
}
}
}
}
int main()
{
freopen("1.txt","r",stdin);
scanf("%d %d %d %d",&n,&m,&c1,&c2);
for(int i = 0;i<n;i++)
{
int temp;
scanf("%d",&temp);
weight[i] = temp;
}
for(int i=0;i<m;i++)
{
int x1,x2,e;
scanf("%d %d %d",&x1,&x2,&e);
node t;
t.v = x2;
t.edge = e;
A[x1].push_back(t);
t.v = x1;
A[x2].push_back(t);
}
Dijkstra();
printf("%d %d",num[c2],w[c2]);
return 0;
}
1003 Emergency (25分) Dijkstra
最新推荐文章于 2022-05-05 20:51:12 发布