hdu 1625 Numbering Paths floyd变形

来源:互联网 发布:淘宝购物流程图片 编辑:程序博客网 时间:2024/05/17 23:22

题意:给定一些带有编号点之间的连接关系,按照格式输出一个二维矩阵。矩阵中map[I][j]代表I到j有多少条路径,如果有无数条,则添上-1;

floyd算法变形,动态规划思想。k代表将第k个点引入“集合”中.

#include<cstdio>#include<cstring>#define Max(a,b) a>b?a:busing 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);} } 

0 0
原创粉丝点击