zoukankan      html  css  js  c++  java
  • Hdu2807The Shortest Path矩阵

      矩阵相乘,判断之后建图。 注意 A  B  C三个互不相同的城市

    #include <cstdio>
    #include <algorithm>
    #include <iostream>
    #include <string.h>
    typedef long long LL;
    using namespace std;
    const int INF =  0xfffffff;
    struct Matrix
    {
        int m[200][200];
    }a[1111];
    int Map[200][200];
    
    Matrix Mul(Matrix a, Matrix b,int n)
    {
        Matrix ans;
        for (int i = 0; i < n; i++){
            for (int j = 0; j < n; j++){
                ans.m[i][j] = 0;
                for (int k = 0; k < n; k++){
                    ans.m[i][j] += a.m[i][k] * b.m[k][j];
                }
            }
        }
        return ans;
    }
    
    int judge(Matrix a, Matrix b, int n)
    {
        for(int i =0;i<n;i++)
            for(int j=0;j<n;j++)
            if(a.m[i][j]!=b.m[i][j]) return 0;
        return 1;
    }
    
    void floyd(int n)
    {
        for (int k = 0; k < n;k++)
        for (int i = 0; i < n; i++){
            for (int j = 0; j < n;j++){
            if(i==j||j==k) continue;
            Map[i][j] = min(Map[i][k] + Map[k][j], Map[i][j]);
            }
        }
    }
    
    void show(Matrix a,int n)
    {
        for(int i =0;i<n;i++){
            for(int j =0 ;j<n;j++)
                printf("%d ",a.m[i][j]);
            printf("
    ");
        }
    }
    int main()
    {
        int n, m;
        while (scanf("%d%d",&n,&m), n || m){
            for (int i = 0; i < n; i++){
                for (int j = 0; j < m;j++)
                for (int k = 0; k < m; k++)
                    scanf("%d", &a[i].m[j][k]);
            }
            for(int i = 0 ;i<n;i++)
                for(int j=0;j<n;j++)
                Map[i][j]=INF;
            for (int i = 0; i < n;i++)
            for (int j = 0; j < n;j++){
                    Matrix ans = Mul(a[i], a[j],m);
            for (int k = 0; k < n; k++){
                if (judge(ans, a[k],m))Map[i][k] = 1;
            }
            }
            floyd(n);
            int k;
            scanf("%d",&k);
            while (k--){
                int b; int c;
                scanf("%d%d", &b, &c);
                b--; c--;
                if (Map[b][c]==INF){
                    printf("Sorry
    ");
                }
                else printf("%d
    ", Map[b][c]);
            }
        }
        return 0;
    }
  • 相关阅读:
    十四、oracle 数据库管理--管理表空间和数据文件
    十一、oracle 数据库管理员
    十二、oracle 数据库(表)的逻辑备份与恢复
    九、oracle 事务
    十、oracle 常用函数
    八、oracle 分页
    七、oracle 表查询二
    五、oracle 表的管理
    六、表查询一
    四、oracle 用户管理(Profile)
  • 原文地址:https://www.cnblogs.com/yigexigua/p/4059424.html
Copyright © 2011-2022 走看看