2 solutions
-
3
对于邻接矩阵和传递闭包的定义题目中已经说了,这里就不多赘述了。
因为数据范围很小,所以我们可以采用 Floyd 算法,该算法的核心代码是:
a[i][k] = min(a[i][k], a[i][j] + a[j][k]);
但这道题中要求我们求的是是否能到达,不是最短路径,那我们该怎么办呢?
其实很简单,把 Floyd 算法的核心代码改一下就行了:
a[i][j] |= (a[i][k] && a[k][j]);
也就是: 如果从 号点可以直接或间接到达 号点,那么
a[i][k]
就为 ,否则为 。代码如下:
#include <bits/stdc++.h> using namespace std; bool a[105][105]; int n, x; int main() { cin >> n; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { cin >> x; if (x == 1) a[i][j] = 1; } } for (int k = 1; k <= n; k++) for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) a[i][j] |= (a[i][k] && a[k][j]); for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { cout << a[i][j] << " "; } cout << endl; } return 0; }
-
0
解释马上补
#include<bits/stdc++.h> using namespace std; bool vis[110][110]; int n; int main(){ cin>>n; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ cin>>vis[i][j]; } } for(int k=1;k<=n;k++){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ vis[i][j]=max(vis[i][j],min(vis[i][k],vis[k][j])); } } } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ cout<<vis[i][j]<<' '; } cout<<endl; } return 0; }
- 1
Information
- ID
- 7089
- Time
- 1000ms
- Memory
- 128MiB
- Difficulty
- 3
- Tags
- # Submissions
- 16
- Accepted
- 13
- Uploaded By