使用数组存邻接表
代码块
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
#define ll long long
#ifdef ONLINE_JUDGE
#else
#define scanf scanf_s
#endif // ONLINE_JUDGE
#define FOR(i,a,b) for(int i = a;i <= b;i++)
#define ROF(i,a,b) for(int i = a;i >= b;i--)
ll read() {
ll X = 0, w = 1; char c = getchar();
while (c < '0' || c>'9') { if (c == '-') w = -1; c = getchar(); }
while (c >= '0' && c <= '9') X = X * 10 + c - '0', c = getchar();
return X * w;
}
ll poww(ll a, ll b, ll mod) {
ll base = 1;
while (b) {
if (b & 1) { base = base * a % mod; }
b >>= 1; a = a * a % mod;
}
return base;
}
const int maxx = 10000 + 50;
int head, tail, n,m;
ll dis[maxx];
int matrix[maxx][maxx];
bool vis[maxx];
void init() {
memset(matrix, 0x3f3f3f3f, sizeof matrix);
memset(dis, 0x3f3f3f3f, sizeof dis);
FOR(i, 1, n) matrix[i][i] = 0;
vis[head] = true; dis[head] = 0;
int a, b,c;
FOR(i,1,n) {
a = read(), b = read(), c = read(); matrix[a][b] = matrix[b][a] = c;
}
FOR(i, 1, n) dis[i] = matrix[head][i];
}
int dijstrla() {
int k = 1;
while (k < m) {
int minn = 0x3f3f3f3f, mini;
FOR(i, 1, n) {
if (!vis[i] && dis[i] < minn)
{
minn = dis[i], mini = i;
}
}
vis[mini] = 1, dis[mini] = minn;
FOR(i, 1, n) {
if (!vis[i]) { dis[i] = min(dis[i], dis[mini] + matrix[mini][i]); }
}
k++, minn = 0x3f3f33f;
}
return dis[tail];
}
int main() {
m = read(), n = read(), head = read();//起始位head 共有m个点 n条边
init(); dijstrla();
int taill;
while (tail = read()) { cout << dis[tail] << endl; }//输出起始点到tail的距离
}
京公网安备 11010502036488号