After reading the complex Dijstral algorithm, I can write the first exercise by myself without looking at the template (though I don’t know if I can remember it for a few days).
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXV = 510;
const int INF = 1e9;
int n, m, c1, c2;
int G[MAXV][MAXV];
int d[MAXV];
bool vis[MAXV] = {
false};
int team[MAXV];
int maxteam[MAXV];
int minpath[MAXV];
void Dijkstral(int s){
fill(d, d+MAXV, INF);
fill(maxteam, maxteam+MAXV, -1);
fill(minpath, minpath+MAXV, 0);
d[s] = 0;
maxteam[s] = team[s];
minpath[s] = 1;
for(int i=0; i<n; i++){
int u = -1, MIN = INF;
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 i=0; i<n; i++){
if(vis[i]==false && G[u][i]!=INF){
if(d[i] > d[u] + G[u][i]){
d[i] = d[u] + G[u][i];
maxteam[i] = maxteam[u] + team[i];
minpath[i] = minpath[u];
}else if(d[i] == d[u] + G[u][i]){
if(maxteam[i] < maxteam[u] + team[i]){
maxteam[i] = maxteam[u] + team[i];
}
minpath[i] += minpath[u];
}
}
}
}
}
int main(){
scanf("%d %d %d %d", &n, &m, &c1, &c2);
for(int i=0; i<n; i++){
scanf("%d", &team[i]);
}
int u, v, w;
fill(G[0], G[0]+MAXV*MAXV, INF);
for(int i=0; i<m; i++){
scanf("%d %d %d", &u, &v, &w);
G[u][v] = w;
G[v][u] = G[u][v];
}
Dijkstral(c1);
printf("%d %d", minpath[c2], maxteam[c2]);
return 0;
}
Dijkstral+DFS solution
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
const int MAXV = 510;
const int INF = 1e9;
int n, m, c1, c2;
int G[MAXV][MAXV];
int d[MAXV];
bool vis[MAXV] = {
false};
int team[MAXV];
int maxteam = -1;
int minpath = 0;
vector<int> pre[MAXV];
vector<int> tempPath, path;
void Dijkstral(int s){
fill(d, d+MAXV, INF);
d[s] = 0;
for(int i=0; i<n; i++){
int u = -1, MIN = INF;
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 i=0; i<n; i++){
if(vis[i]==false && G[u][i]!=INF){
if(d[i] > d[u] + G[u][i]){
d[i] = d[u] + G[u][i];
pre[i].clear();
pre[i].push_back(u);
}else if(d[i] == d[u] + G[u][i]){
pre[i].push_back(u);
}
}
}
}
}
void DFS(int v){
if(v == c1){
minpath++;
tempPath.push_back(v);
int num = 0;
for(int i=0; i<tempPath.size(); i++){
int index = tempPath[i];
num += team[index];
}
if(num > maxteam){
maxteam = num;
path = tempPath;
}
tempPath.pop_back();
return;
}
tempPath.push_back(v);
for(int i=0; i<pre[v].size(); i++){
DFS(pre[v][i]);
}
tempPath.pop_back();
}
int main(){
scanf("%d %d %d %d", &n, &m, &c1, &c2);
for(int i=0; i<n; i++){
scanf("%d", &team[i]);
}
int u, v, w;
fill(G[0], G[0]+MAXV*MAXV, INF);
for(int i=0; i<m; i++){
scanf("%d %d %d", &u, &v, &w);
G[u][v] = w;
G[v][u] = G[u][v];
}
Dijkstral(c1);
DFS(c2);
printf("%d %d", minpath, maxteam);
return 0;
}