![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <map> #include <cmath> #include <queue> #include <string> #include <cstdio> #include <vector> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define ll long long const ll inf = 0x3f3f3f3f3f3f3f3f; const int maxn = 500+5; const ll mod = 1e9+7; int we[maxn]; int w[maxn]; int d[maxn]; int g[maxn][maxn]; int num[maxn]; int vis[maxn]; int n; void dij(int s){ memset(d,0x3f,sizeof(d)); d[s] = 0; num[s] = 1; w[s] = we[s]; while(true){ int u = -1, MIN = 0x3f3f3f3f; 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]!=0x3f3f3f3f){ if(d[u]+g[u][v]<d[v]){ d[v] = d[u] + g[u][v]; w[v] = w[u] + we[v]; num[v] = num[u]; }else if(d[u]+g[u][v] == d[v]){ w[v] = max(w[v],w[u] + we[v]); num[v] += num[u]; } } } } } int main(){ int m, c1, c2; int u, v, l; memset(g,0x3f,sizeof(g)); scanf("%d%d%d%d",&n,&m,&c1,&c2); for(int i=0;i<n;i++) scanf("%d",&we[i]); for(int i=0;i<m;i++){ scanf("%d%d%d",&u,&v,&l); g[u][v] = g[v][u] = l; } dij(c1); printf("%d %d ",num[c2],w[c2]); return 0; }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <map> #include <cmath> #include <queue> #include <string> #include <cstdio> #include <vector> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define ll long long const ll inf = 0x3f3f3f3f3f3f3f3f; const int maxn = 500+5; const ll mod = 1e9+7; int we[maxn]; int w[maxn]; int d[maxn]; int g[maxn][maxn]; int num[maxn]; int vis[maxn]; int n; typedef pair<int,int>P; void dij(int s){ memset(d,0x3f,sizeof(d)); d[s] = 0; num[s] = 1; w[s] = we[s]; priority_queue<P, vector<P>,greater<P>>q; q.push(P(0,s)); while(!q.empty()){ P p = q.top();q.pop(); int v = p.second; if(d[v] < p.first)continue; for(int i=0;i<n;i++){ if(d[i] > d[v]+g[v][i]){ d[i] = d[v]+g[v][i]; w[i] = w[v]+we[i]; num[i] = num[v]; q.push(P(d[i],i)); }else if(d[i] == d[v]+g[v][i]){ num[i] += num[v]; w[i] = max(w[i],w[v]+we[i]); } } } } int main(){ int m, c1, c2; int u, v, l; memset(g,0x3f,sizeof(g)); scanf("%d%d%d%d",&n,&m,&c1,&c2); for(int i=0;i<n;i++) scanf("%d",&we[i]); for(int i=0;i<m;i++){ scanf("%d%d%d",&u,&v,&l); g[u][v] = g[v][u] = l; } dij(c1); printf("%d %d ",num[c2],w[c2]); return 0; }