求最短路径的dij和bell方法。
顺带求最短路径的条数和求多重标尺的做法
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;
const int S = 1000;
const int INF = 100000000;
struct Node {
int number;
int dis;
Node (int number, int dis) : number(number), dis(dis) {}
};
int N, M, C1, C2;
vector<Node> adj[S];
int hands[S]; //hands[i] : 第i个城的救援队人数
int cHands[S] = {0}; //c[i]:从起始位置到i所带的救援队人数
int num[S] = {0};
set<int> pre[S];
bool visit[S] = {false};
int d[S]; /*定义错类型,将d定义为bool*/
// void DisT() {
// fill(d, d + S, INF);
// d[C1] = 0;
// cHands[C1] = hands[C1];
// num[C1] = 1;
// for (int i = 0; i < N; i ++) {
// int minI = -1, minDis = INF;
// for (int j = 0; j < N; j ++) {
// if (d[j] < minDis && visit[j] == false) { /*漏掉visit[j] == false*/
// minI = j;
// minDis = d[j];
// }
// }
// if (minI == -1) return ;
// visit[minI] = true;
// for (int v = 0; v < adj[minI].size(); v ++) {
// int vNumber = adj[minI][v].number;
// int vDis = adj[minI][v].dis;
// if (visit[vNumber] == false) {
// if (d[minI] + vDis < d[vNumber]) {
// d[vNumber] = d[minI] + vDis;
// cHands[vNumber] = cHands[minI] + hands[vNumber];
// num[vNumber] = num[minI];
// }
// else if (d[minI] + vDis == d[vNumber]) {
// num[vNumber] += num[minI];
// if (cHands[minI] + hands[vNumber] > cHands[vNumber]) {
// cHands[vNumber] = cHands[minI] + hands[vNumber];
// }
// }
// }
// }
// }
// }
void Bellman() {
fill(d, d + S, INF);
d[C1] = 0;
cHands[C1] = hands[C1];
num[C1] = 1;
for (int i = 0; i < N - 1; i ++) {
for (int u = 0; u < N; u ++) {
for (int j = 0; j < adj[u].size(); j ++) {
int v = adj[u][j].number;
int dis = adj[u][j].dis;
if (d[u] + dis < d[v]) {
d[v] = d[u] + dis;
cHands[v] = cHands[u] + hands[v];
num[v] = num[u];
pre[v].clear();
pre[v].insert(u);
} else if (d[u] + dis == d[v]) {
if (cHands[u] + hands[v] > cHands[v]) cHands[v] = cHands[u] + hands[v];
pre[v].insert(u);
num[v] = 0;
set<int>::iterator it;
for (it = pre[v].begin(); it != pre[v].end(); it ++) {
num[v] += num[*it];
}
}
}
}
}
}
int main() {
cin >> N >> M >> C1 >> C2;
for (int i = 0; i < N; i ++) {
cin >> hands[i];
}
int c1, c2, dis;
for (int i = 0; i < M; i ++) {
cin >> c1 >> c2 >> dis; /*忘记输入*/
Node node1(c1, dis);
Node node2(c2, dis);
adj[c1].push_back(node2);
adj[c2].push_back(node1);
}
// DisT();
Bellman();
cout << num[C2] << " " << cHands[C2] << endl;
return 0;
}