2 solutions

  • 3
    @ 2025-4-26 19:59:49

    对于邻接矩阵和传递闭包的定义题目中已经说了,这里就不多赘述了。

    因为数据范围很小,所以我们可以采用 Floyd 算法,该算法的核心代码是:a[i][k] = min(a[i][k], a[i][j] + a[j][k]);

    但这道题中要求我们求的是是否能到达,不是最短路径,那我们该怎么办呢?

    其实很简单,把 Floyd 算法的核心代码改一下就行了:a[i][j] |= (a[i][k] && a[k][j]);

    也就是: 如果从 ii 号点可以直接或间接到达 kk 号点,那么 a[i][k] 就为 11,否则为 00

    代码如下:

    #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
      @ 2025-4-26 21:28:07
      解释马上补
      #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