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;
    }
  • 相关阅读:
    数据透视表快速按年月分组
    会计-汇兑损益账务处理
    vs Mvc晋级
    sql语句建立新表SMFIELD
    access左侧导航栏拉窄后,鼠标悬停时无法拉宽。
    SQL函数min和max用法
    转发一个很齐全的gridview应用帖子
    循环
    JavaScript的进阶学习
    JavaScript的学习
  • 原文地址:https://www.cnblogs.com/yigexigua/p/4059424.html
Copyright © 2011-2022 走看看