Fiasco
题意:给一个按bfs求最短路的代码(这个方法明显有bug),然后给出点和路段,问让你重新分配路径的值使得上诉错误的代码可以得到正确的值
解法:先把路径长度排序,再按bfs序从小到大分配
#include <iostream>
using namespace std;
#include <stdio.h>
#include <algorithm>
#include <cstring>
int a[30000][3], b[30000], map[2600][2600], tot, n, m, k;
bool flag[2600];
void sort(int i, int j) {
int p = i, q = j;
int mid = b[(p+q)/2];
while (p <= q) {
while (b[p] < mid) p++;
while (b[q] > mid) q--;
if (p <= q) {
int temp = b[p];
b[p] = b[q];
b[q] = temp;
p++; q--;
}
}
if (i < q) sort(i, q);
if (p < j) sort(p, j);
}
void bfs(int s) {
int d[2600];
d[1] = s;
int i = 0, j = 1;
while (i < j) {
i++;
flag[d[i]] = true;
for (int k = 1; k <= n; k++) if (map[d[i]][k] != 0 && !flag[k]) {
tot++;
a[map[d[i]][k]][0] = b[tot];
j++;
d[j] = k;
flag[k] = true;
}
}
}
int main() {
int tt;
cin >> tt;
for (int cases = 1; cases <= tt; cases++) {
cin >> n >> m >> k;
memset(map, 0, sizeof(map));
memset(flag, 0, sizeof(flag));
for (int i = 1; i <= m; i++) {
cin >> a[i][1] >> a[i][2];
a[i][0] = 0;
cin >> b[i];
map[a[i][1]][a[i][2]] = i;
map[a[i][2]][a[i][1]] = i;
}
sort(1, m);
tot = 0;
bfs(k);
for (int i = 1; i <= m; i++) if (a[i][0] == 0) {
tot++;
a[i][0] = b[tot];
}
cout << "Case " << cases << ":" << endl;
for (int i = 1; i <= m; i++)
cout << a[i][1] << " " << a[i][2] << " " << a[i][0] << endl;
}
}