您的位置:首页 > 其它

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

2016-04-05 22:02 621 查看
题目链接

题意:给出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

,mp

,n,m;

void matrix(int u,int v)
{
int t

={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;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: