zoukankan      html  css  js  c++  java
  • hdu 2807(矩阵+floyed)

    The Shortest Path

    Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 2996    Accepted Submission(s): 980


    Problem Description
    There are N cities in the country. Each city is represent by a matrix size of M*M. If city A, B and C satisfy that A*B = C, we say that there is a road from A to C with distance 1 (but that does not means there is a road from C to A).
    Now the king of the country wants to ask me some problems, in the format:
    Is there is a road from city X to Y?
    I have to answer the questions quickly, can you help me?
     
    Input
    Each test case contains a single integer N, M, indicating the number of cities in the country and the size of each city. The next following N blocks each block stands for a matrix size of M*M. Then a integer K means the number of questions the king will ask, the following K lines each contains two integers X, Y(1-based).The input is terminated by a set starting with N = M = 0. All integers are in the range [0, 80].
     
    Output
    For each test case, you should output one line for each question the king asked, if there is a road from city X to Y? Output the shortest distance from X to Y. If not, output "Sorry".
     
    Sample Input
    3 2 1 1 2 2 1 1 1 1 2 2 4 4 1 1 3 3 2 1 1 2 2 1 1 1 1 2 2 4 3 1 1 3 0 0
     
    Sample Output
    1 Sorry
     
    暴力竟然过了,O(N^5)这题数据多水。。。要注意A,B,C矩阵不能够相同(A,B和A,C一般能够注意,主要是B,C不能相同)
    #include <stdio.h>
    #include <algorithm>
    #include <string.h>
    #include <math.h>
    #include <queue>
    using namespace std;
    const int N = 100;
    const int INF= 99999999;
    struct Matrix
    {
        int v[N][N];
    } M[N];
    int n,m;
    int graph[N][N];
    Matrix mult(Matrix a,Matrix b)
    {
        Matrix temp;
        memset(temp.v,0,sizeof(temp.v));
        for(int i=0; i<m; i++)
        {
            for(int j=0; j<m; j++)
            {
                for(int k=0; k<m; k++)
                {
                    temp.v[i][j] += a.v[i][k]*b.v[k][j];
                }
            }
        }
        return temp;
    }
    bool Judge(Matrix a,Matrix b)
    {
        for(int i=0; i<m; i++)
        {
            for(int j=0; j<m; j++)
            {
                if(a.v[i][j]!=b.v[i][j]) return false;
            }
        }
        return true;
    }
    int main()
    {
        while(scanf("%d%d",&n,&m)!=EOF,n+m)
        {
            for(int i=0; i<n; i++)
            {
                for(int j=0; j<n; j++)
                {
                    if(i==j) graph[i][j] = 0;
                    else graph[i][j]=INF;
                }
            }
            for(int i=0; i<n; i++)
            {
                for(int j=0; j<m; j++)
                {
                    for(int k=0; k<m; k++)
                    {
                        scanf("%d",&M[i].v[j][k]);
                    }
                }
            }
            for(int i=0; i<n; i++)
            {
                for(int j=0; j<n; j++)
                {
                    if(i!=j)
                    {
                        Matrix t = mult(M[i],M[j]);
                        for(int k=0; k<n; k++)
                        {
                            if(i!=k&&j!=k&&Judge(t,M[k]))  ///这里要注意:矩阵i,j,k不能够相同
                            {
                                graph[i][k]=1;
                            }
                        }
                    }
                }
            }
            for(int k=0; k<n; k++)
            {
                for(int i=0; i<n; i++)
                {
                    for(int j=0; j<n; j++)
                    {
                        graph[i][j] = min(graph[i][j],graph[i][k]+graph[k][j]);
                    }
                }
            }
            int t ;
            scanf("%d",&t);
            while(t--)
            {
                int a,b;
                scanf("%d%d",&a,&b);
                a--,b--;
                if(graph[a][b]>=INF) printf("Sorry
    ");
                else printf("%d
    ",graph[a][b]);
            }
        }
    }
     
  • 相关阅读:
    卖菜起家赚到100万,他怎样做到的?
    百万网站创始人,痴迷网络经营,成就创业梦想
    徐小平靠投资进行创业,他却格外与众不同
    金融专业学生收卖废品,做起了“破烂王”
    pod setup命令失败解决方法
    pod setup命令失败解决方法
    pod setup命令失败解决方法
    pod setup命令失败解决方法
    PHP的闭包和匿名函数
    PHP的闭包和匿名函数
  • 原文地址:https://www.cnblogs.com/liyinggang/p/5494714.html
Copyright © 2011-2022 走看看