版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mobius_strip/article/details/88853163
题目
已知路由器的链接关系,求两个节点间的最短路径并输出路径(有多个最小值输出最小字典序)。
分析
图论,有向图最短路。直接bfs求解。
说明
ε=(´ο`*)))唉
#include <stdio.h>
#include <stdlib.h>
const int data_size = 301;
int path[data_size][data_size];
int parent[data_size];
int queue[data_size];
int visit[data_size];
// output
void output(int s)
{
if (s != parent[s])
output(parent[s]);
printf("%d ", s);
}
int bfs(int s, int t, int n)
{
if (s == t) {
printf("%d\n", s);
return 0;
}
for (int i = 1; i < data_size; ++ i) {
visit[i] = 0;
parent[i] = i;
}
int head = 0, tail = 0;
queue[tail ++] = s;
visit[s] = 1;
while (head < tail) {
int now = queue[head ++];
for (int i = 1; i < data_size; ++ i) {
if (path[now][i] && !visit[i]) {
if (i == t) {
output(now);
printf("%d\n", i);
return 1;
}
visit[i] = 1;
queue[tail ++] = i;
parent[i] = now;
}
}
}
puts("connection impossible");
return 0;
}
// input
char buf[3003];
int get_id_from_buf(int& index, char buf[])
{
while (buf[index] && (buf[index] < '0' || buf[index] > '9')) {
index ++;
}
int ans = 0;
while (buf[index] && buf[index] >= '0' && buf[index] <= '9') {
ans = ans * 10 + buf[index ++] - '0';
}
return ans;
}
int main()
{
int n, m, u, v;
while (~scanf("%d", &n) && n) {
for (int i = 1; i < data_size; ++ i) {
for (int j = 1; j < data_size; ++ j) {
path[i][j] = 0;
}
}
getchar();
for (int i = 1; i <= n; ++ i) {
gets(buf);
int index = 0;
int s = get_id_from_buf(index, buf);
int t = get_id_from_buf(index, buf);
while (t) {
path[s][t] = 1;
t = get_id_from_buf(index, buf);
}
}
scanf("%d", &m);
puts("-----");
for (int i = 1; i <= m; ++ i) {
scanf("%d%d", &u, &v);
bfs(u, v, n);
}
}
return 0;
}