HDU 2807 The Shortest Path 矩阵运算+最短路

来源:互联网 发布:四川大学网络教育平台 编辑:程序博客网 时间:2024/06/05 15:48

题目链接

http://acm.hdu.edu.cn/showproblem.php?pid=2807

题意

给定n个m*m的矩阵,对于A矩阵,C矩阵,如果存在B矩阵满足A*B = C,那么图中A->B有条权值为1的边。求最短路

思路

蛮简单的一题居然给我写T了。建图直接按照题意描述建,跑Floyd获取最短路。

#include<cstdio>#include<queue>#include<iostream>#include<vector>#include<map>#include<cstring>#include<string>#include<set>#include<stack>#include<algorithm>#define cle(a) memset(a,0,sizeof(a))#define inf(a) memset(a,0x3f,sizeof(a))#define ll long long#define Rep(i,a,n) for(int i=a;i<=n;i++)using namespace std;#define INF2 9223372036854775807llconst int INF = ( 2e9 ) + 2;const ll maxn = 90;int mp[maxn][maxn][maxn];int c[maxn][maxn],res[maxn][maxn];int n,m;void mul(int b[maxn][maxn],int c[maxn][maxn]){    int t;    memset(res,0,sizeof(res));    for(int i=1;i<=m;i++)    for(int j=1;j<=m;j++)    {        for(int k=1;k<=m;k++)            res[i][j]+=b[i][k]*c[k][j];    }}bool same(int a[maxn][maxn]){    for(int i=1;i<=m;i++)    for(int j=1;j<=m;j++)    if(res[i][j]!=a[i][j])return false;    return true;}int main(){    while(~scanf("%d%d",&n,&m)&&(n+m))    {        memset(c,0,sizeof(c));        for(int i=1;i<=n;i++)        {            for(int j=1;j<=m;j++)            for(int k=1;k<=m;k++)            scanf("%d",&mp[i][j][k]);        }        for(int i=1;i<=n;i++)        for(int j=1;j<=n;j++)        {            if(i==j)continue;            mul(mp[i],mp[j]);            for(int k=1;k<=n;k++)            {                if(k!=i&&k!=j&&same(mp[k]))                c[i][k]=1;            }        }        for(int k=1;k<=n;k++)        for(int i=1;i<=n;i++)        {            if(c[i][k]==0)continue;            for(int j=1;j<=n;j++)            if(c[k][j]!=0)            {                if(c[i][j]==0)                c[i][j]=c[i][k]+c[k][j];                if(c[i][j]>c[i][k]+c[k][j])                c[i][j]=c[i][k]+c[k][j];            }        }        int q;        scanf("%d",&q);        for(int T=0;T<q;T++)        {            int u,v;            scanf("%d%d",&u,&v);            if(c[u][v])            printf("%d\n",c[u][v]);            else            printf("Sorry\n");        }    }}
阅读全文
0 0
原创粉丝点击