hdu 2807 The Shortest Path 优化矩阵运算+floyd

题目链接

题意:给出n个城市,每个城市为一个m阶矩阵。若存在矩阵B使矩阵A*B==C,那么城市A到C有一条路径为1的路。求两个城市之间的最短路。

这题貌似一般的暴力过不了,需要用到矩阵乘法的优化。由于这题的数据量很小,判断出两个城市之间的路径后用Floyd就可以轻松求解。

矩阵相乘优化算法实现讲解:传送门。

这题要注意A,B,C之间都不相等,否则wa。

#include <iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define N 85
#define INF 0x7ffffff

using namespace std;

int mx[N][N][N],mp[N][N],n,m;

void matrix(int u,int v)
{
    int t[N][N]={0};
    for(int i=0;i<m;i++)
        for(int k=0;k<m;k++)
            if(mx[u][i][k])
                for(int j=0;j<m;j++)
                    t[i][j]+=mx[u][i][k]*mx[v][k][j];
    for(int i=0;i<n;i++)
    {
        int flag=1;
        if(i==u||i==v)  continue;
        for(int j=0;j<m&&flag;j++)
            for(int k=0;k<m&&flag;k++)
                if(mx[i][j][k]!=t[j][k])    flag=0;
        if(flag)    mp[u][i]=1;
    }
}

void floyd()
{
    for(int k=0;k<n;k++)
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);
}

int main()
{
    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",&mx[i][j][k]);
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                mp[i][j]=INF;
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                if(i!=j)    matrix(i,j);
        floyd();
        int k;
        cin>>k;
        for(int i=0;i<k;i++)
        {
            int u,v;
            scanf("%d%d",&u,&v);
            if(mp[u-1][v-1]>=INF)   cout<<"Sorry"<<endl;
            else    cout<<mp[u-1][v-1]<<endl;
        }
    }
}

你可能感兴趣的:(最短路,HDU,Matrix,floyd,矩阵乘法优化)