题意:给定一些带有编号点之间的连接关系,按照格式输出一个二维矩阵。矩阵中map[I][j]代表I到j有多少条路径,如果有无数条,则添上-1;
floyd算法变形,动态规划思想。k代表将第k个点引入“集合”中.
#include<cstdio>
#include<cstring>
#define Max(a,b) a>b?a:b
using namespace std;
const int maxn =40;
int map[maxn][maxn];
void floyd(int maxi)
{
for(int k=0;k<maxi;k++)
{
for(int i=0;i<maxi;i++)
for(int j=0;j<maxi;j++)
map[i][j]+=(map[i][k]*map[k][j]);
}
for(int k=0;k<maxi;k++)
if(map[k][k]!=0)//有环,所有与k相连的都成环
{
for(int i=0;i<maxi;i++)
for(int j=0;j<maxi;j++)
if(map[i][k]&&map[k][j])
map[i][j]=-1;
}
for(int i=0;i<maxi;i++)
{
for(int j=0;j<maxi;j++)
printf(" %d",map[i][j]);
printf("\n");
}
}
int main()
{
int n,a,b,maxi=-1,k=0;
while(scanf("%d",&n)!=EOF)
{
memset(map,0,sizeof(map));
maxi=-1;
for(int i=0;i<n;i++)
{
scanf("%d%d",&a,&b);
map[a][b]=1;
if(maxi<(Max(a,b)))
{
maxi=Max(a,b);
}
}
maxi++;
printf("matrix for city %d\n",k++);
floyd(maxi);
}
}