这道题目 可以理解为求单源最短路径
所以说spfa算法可完美解决
不懂得同学可以去网上搜一搜spfa算法,
这题最坑的是答案输出 他的输出格式跟正确答案的输出格式不一样
“1. Columns are tab separated.”意思是用\t来做空格
#include<stdio.h>
#include<iostream>
#include<memory.h>
#include<string.h>
#include<string>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
using namespace std;
int dis[25];
int flag[25];
int path[25];
vector<int> from[25];
vector<int> ori;
int mp[25][25];
const int maxnum = 0x3f3f3f3f;
int n, des;
struct node {
int o;
int d;
int t;
vector<int> pa;
};
void inti() {
for (int i = 0; i <= n; i++) {
from[i].clear();
}
memset(path, 0, sizeof(path));
memset(dis, maxnum, sizeof(dis));
memset(flag, 0, sizeof(flag));
ori.clear();
}
void read() {
int i, j, o;
for (i = 1; i <= n; i++) {
for (j = 1; j <= n; j++) {
scanf("%d", &mp[i][j]);
if (mp[i][j] != -1) {
from[j].push_back(i);
}
}
}
scanf("%d", &des);
while (1) {
if (cin.get() == '\n') break;
scanf("%d", &o);
ori.push_back(o);
}
}
void spfa() {
queue<int> q;
q.push(des);
dis[des] = 0;
flag[des] = 1;
int x, i, d, t, j;
while (!q.empty()) {
x = q.front();
q.pop();
flag[x] = 0;
d = dis[x];
for (i = 0; i < from[x].size(); i++) {
t = from[x][i];
if (dis[t] > (dis[x] + mp[t][x])) {
dis[t] = dis[x] + mp[t][x];
path[t] = x;
if (!flag[t]) {
flag[t] = 1;
q.push(t);
}
}
}
}
}
bool cmp(node n1, node n2) {
return n1.t < n2.t;
}
void solve() {
node ans[25];
int coun = 0;
for (int i = 0; i < ori.size(); i++) {
vector<int> v;
int o = ori[i];
while (o != des) {
v.push_back(o);
o = path[o];
}
v.push_back(des);
node nd = {ori[i], des, dis[ori[i]], v};
ans[coun++] = nd;
}
sort(ans, ans + coun, cmp);
printf("Org\tDest\tTime\tPath\n");
for (int i = 0; i < coun; i++) {
// if (i) printf("\n");
node t = ans[i];
printf("%d\t%d\t%d", t.o, t.d, t.t);
if (t.o == t.d) {
printf("\t%d", t.d);
} else {
printf("\t%d", t.pa[0]);
for (int j = 1; j < t.pa.size(); j++) {
printf("\t%d", t.pa[j]);
}
}
printf("\n");
}
}
int main() {
int t;
scanf("%d", &t);
while (t--) {
scanf("%d", &n);
inti();
read();
spfa();
solve();
if (t) printf("\n");
}
}