题意:给出6个城市,用c[i][j]表示从i城市到j城市是否有汽车直达,为1时表示可以,0表示不可以。给出一个城市i,问从i可以到达的城市,包含汽车中转
思路:其实就是多源路径问题,可以使用floyd_warshall算法
具体代码如下:
#include <iostream>
#include <cstring>
#include <fstream>
using namespace std;
const int N = 6;
class Solution
{
public:
void floyd_warshall(int c[][N], int n)
{
memcpy(dp, c, sizeof(int) * n * N);
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
for (int k = 0; k < N; k++)
{
if (dp[i][k] && dp[k][j])
{
dp[i][j] = 1;
}
}
}
}
}
void output(int n)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < N; j++)
{
if (dp[i][j])
{
cout << i << " to " << j << endl;
}
}
}
}
private:
int dp[N][N];
};
int main()
{
#ifndef ONLINE_JUDGE
ifstream fin("f:\\OJ\\uva_in.txt");
streambuf *backup = cin.rdbuf(fin.rdbuf());
#endif
int c[N][N];
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
cin >> c[i][j];
}
}
Solution solver;
solver.floyd_warshall(c, N);
solver.output(N);
#ifndef ONLINE_JUDGE
cin.rdbuf(backup);
#endif
return 0;
}
假设c数组表示如下:
0 1 0 0 0 0
0 0 1 0 0 0
0 0 0 1 0 0
0 0 0 0 1 0
0 0 0 0 0 1
0 0 0 0 0 0
其可达输出为: