dijkstra有点难背。
一定要掌握掌握!!
#include<bits/stdc++.h>
using namespace std;
const int INF=100000000;
struct node{
int v,dis;
};
vector<node> g[500];
bool vis[500]={};
int d[500];
int weight[500];
int w[500];
int num[500]={};
int n;
void Dijkstra(int s){
fill(d,d+500,INF);
fill(w,w+500,0);
w[s]=weight[s];
num[s]=1;
d[s]=0;
for(int i=0;i<n;i++){
int minn=INF,u=-1;
for(int j=0;j<n;j++){
if(minn>d[j]&&vis[j]==false){
minn=d[j];
u=j;
}
}
if(u==-1)return;
vis[u]=true;
for(int j=0;j<g[u].size();j++){
int v=g[u][j].v;
if(vis[v]==false){
if(d[v]>d[u]+g[u][j].dis){
d[v]=d[u]+g[u][j].dis;
w[v]=w[u]+weight[v];
num[v]=num[u];
}
else if(d[v]==d[u]+g[u][j].dis&&w[v]<w[u]+weight[v]){
w[v]=w[u]+weight[v];num[v]=num[v]+num[u];
}
else if(d[v]==d[u]+g[u][j].dis)num[v]=num[v]+num[u];
}
}
}
}
int main(){
int m,c1,c2;
cin>>n>>m>>c1>>c2;
for(int i=0;i<n;i++){
cin>>weight[i];
}
int a,b,l;
for(int i=0;i<m;i++){
cin>>a>>b>>l;
node temp;
temp.dis=l;
temp.v=b;
g[a].push_back(temp);
temp.v=a;
g[b].push_back(temp);
}
Dijkstra(c1);
printf("%d %d",num[c2],w[c2]);
return 0;
}