Problem
给定两个点间的路径数的个位,还原整张图,矩阵表示。只可能编号小的点连向编号大的点。
Solution
i到j是否直接相连取决于所有的k to j(i<k<j且i与k直接相连)的路径数的和是否小于i to j的路径数。从大到小枚举i,从小到大枚举j,同时维护与i直接相连的点即可。
Code
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn=520,mod=10;
char s[maxn][maxn];
int g[maxn][maxn],n,q[maxn],cnt,ac[maxn][maxn];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
scanf("%s",s[i]+1);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
g[i][j]=s[i][j]-'0';
for(int i=n-1;i>=1;i--)
{
cnt=0;
for(int j=i+1;j<=n;j++)
{
int ans=0;
for(int k=1;k<=cnt;k++)
ans+=g[q[k]][j];
ans%=10;
if((ans+1)%10==g[i][j])
{
ac[i][j]=1;
q[++cnt]=j;
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
cout<<ac[i][j];
cout<<endl;
}
return 0;
}