您的位置:首页 > 其它

UVa 208 - Firetruck

2016-04-12 19:47 375 查看
題目:有m個城市,求從1到n的所有路徑。

分析:圖論,搜索。數據較大,先求解連通關係,再通過dfs 求解。

說明:連通關係可以使用并查集、Tarjan、逆向dfs、floyd等方法。

#include <cstring>
#include <cstdio>

int maps[22][22], used[22], save[22];

int dfs(int s, int e, int d, int size)
{
if (s == e) {
printf("1");
for (int i = 1; i < d; ++ i)
printf(" %d",save[i]);
puts("");
return 1;
}
int sum = 0;
for (int i = 2; i <= size; ++ i)
if (!used[i] && maps[i][e] && maps[s][i] == 1) {
used[i] = 1;
save[d] = i;
sum += dfs(i, e, d+1, size);
used[i] = 0;
}
return sum;
}

int main()
{
int n, u, v, cases = 1;
while (~scanf("%d",&n)) {
memset(maps, 0, sizeof(maps));
int size = 0;
while (~scanf("%d%d",&v,&u) && (u|v)) {
maps[u][v] = 1;
maps[v][u] = 1;
if (size < u) size = u;
if (size < v) size = v;
}

//floyd
for (int k = 1; k <= size; ++ k)
for (int i = 1; i <= size; ++ i)
for (int j = 1; j <= size; ++ j)
if (!maps[i][j] && maps[i][k] && maps[k][j])
maps[i][j] = 2;

printf("CASE %d:\n",cases ++);
used[1] = 1;
save[0] = 1;
printf("There are %d routes ",dfs(1, n, 1, size));
printf("from the firestation to streetcorner %d.\n",n);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: