题意:给定几所城市,每个城市可以表示成矩阵,如果A*B=C,则表明城市A到B有路径,且长为1.给定若干询问,判断询问城市是否连通?
分析:这题数据水。。暴力即可。
//1014ms
#include<cstdio>
#include<algorithm>
#include<cstring>
#define MAX_N 85
#define inf 0x3f3f3f3f
using namespace std;
int n,m;
struct node
{
// int id;
int mat[MAX_N][MAX_N];
bool operator==(const node &other)const
{
for(int i=0;i<m;i++)
{
for(int j=0;j<m;j++)
{
if(mat[i][j]!=other.mat[i][j])
return false;
}
}
return true;
}
}city[MAX_N];
int d[MAX_N][MAX_N];
node multiply(node x,node y)
{
node temp;
memset(temp.mat,0,sizeof(temp.mat));
for(int i=0;i<m;i++)
{
for(int j=0;j<m;j++)
{
for(int k=0;k<m;k++)
{
temp.mat[i][j]+=x.mat[i][k]*y.mat[k][j];
}
}
}
return temp;
}
void warshall_floyd(void)
{
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
}
}
return ;
}
int main(void)
{
while(scanf("%d%d",&n,&m)==2)
{
if(n==0&&m==0)
break;
for(int i=1;i<=n;i++)
{
for(int j=0;j<m;j++)
{
for(int k=0;k<m;k++)
scanf("%d",&city[i].mat[j][k]);
}
// city[i].id=i;
}
for(int i=1;i<=n;i++)
{
d[i][i]=0;
for(int j=i+1;j<=n;j++)
d[i][j]=d[j][i]=inf;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i==j)
continue;
node c=multiply(city[i],city[j]);
for(int k=1;k<=n;k++)
{
if(k==i||k==j||d[i][k]==1)
continue;
if(city[k]==c)
{
d[i][k]=1;
// break;
}
}
}
}
warshall_floyd();
int k;
scanf("%d",&k);
while(k--)
{
int x,y;
scanf("%d%d",&x,&y);
if(d[x][y]==inf)
{
printf("Sorry\n");
continue;
}
printf("%d\n",d[x][y]);
}
}
return 0;
}
//374ms
#include<cstdio>
#include<algorithm>
#include<cstring>
#define MAX_N 85
#define inf 0x3f3f3f3f
using namespace std;
int n,m;
struct node
{
int mat[MAX_N][MAX_N];
bool operator==(const node &other)const
{
for(int i=0;i<m;i++)
{
for(int j=0;j<m;j++)
{
if(mat[i][j]!=other.mat[i][j])
return false;
}
}
return true;
}
}city[MAX_N];
int d[MAX_N][MAX_N];
node multiply(node x,node y)
{
node temp;
memset(temp.mat,0,sizeof(temp.mat));
for(int i=0;i<m;i++)
{
for(int k=0;k<m;k++)
{
if(x.mat[i][k])
{
for(int j=0;j<m;j++)
{
temp.mat[i][j]+=x.mat[i][k]*y.mat[k][j];
}
}
}
}
return temp;
}
void warshall_floyd(void)
{
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
if(d[i][k]==inf)
continue;
for(int j=1;j<=n;j++)
{
if(d[k][j]==inf)
continue;
d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
}
}
}
return ;
}
int main(void)
{
while(scanf("%d%d",&n,&m)==2)
{
if(n==0&&m==0)
break;
for(int i=1;i<=n;i++)
{
for(int j=0;j<m;j++)
{
for(int k=0;k<m;k++)
scanf("%d",&city[i].mat[j][k]);
}
}
for(int i=1;i<=n;i++)
{
d[i][i]=0;
for(int j=i+1;j<=n;j++)
d[i][j]=d[j][i]=inf;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i==j)
continue;
node c=multiply(city[i],city[j]);
for(int k=1;k<=n;k++)
{
if(k==i||k==j)
continue;
if(city[k]==c)
{
d[i][k]=1;
// break;
}
}
}
}
warshall_floyd();
int k;
scanf("%d",&k);
for(int i=0;i<k;i++)
{
int x,y;
scanf("%d%d",&x,&y);
if(d[x][y]==inf)
{
printf("Sorry\n");
continue;
}
printf("%d\n",d[x][y]);
}
}
return 0;
}