zoukankan      html  css  js  c++  java
  • hdu 1625(floyd判环)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1625

    思路:大牛说是floyd判环,一想确实如此,我还一直在想如果用记忆化的怎么处理环呢...orz....

    首先通过Floyd预处理,把所有的路径数求出来,即d[i][j] += d[i][k] * d[k][j]。然后确定有无环,如果存在环的话,即d[k][k] != 0(存在环),那么所有的点i,j,只要经过了k(i->k->j),那么它的路径数是不能确定的,反之,确定。

    View Code
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 using namespace std;
     5 #define MAXN 55
     6 int path[MAXN][MAXN];
     7 int m,n;
     8 
     9 void floyd(){
    10     for(int k=0;k<=n;k++){
    11         for(int i=0;i<=n;i++){
    12             for(int j=0;j<=n;j++){
    13                 path[i][j]+=path[i][k]*path[k][j];
    14             }
    15         }
    16     }
    17     for(int i=0;i<=n;i++)if(path[i][i]){
    18         path[i][i]=-1;
    19         for(int j=0;j<=n;j++){
    20             for(int k=0;k<=n;k++){
    21                 if(path[j][i]&&path[i][k]){
    22                     path[j][k]=-1;
    23                 }
    24             }
    25         }
    26     }
    27 }
    28 
    29 int main(){
    30     int u,v,t=0;
    31     while(~scanf("%d",&m)){
    32         memset(path,0,sizeof(path));
    33         n=0;
    34         for(int i=1;i<=m;i++){
    35             scanf("%d%d",&u,&v);
    36             path[u][v]=1;
    37             n=max(n,max(u,v));
    38         }
    39         printf("matrix for city %d\n",t++);
    40         floyd();
    41         for(int i=0;i<=n;i++){
    42             for(int j=0;j<n;j++){
    43                 printf(" %d",path[i][j]);
    44             }
    45             printf(" %d\n",path[i][n]);
    46         }
    47     }
    48     return 0;
    49 }
  • 相关阅读:
    输入框组
    下拉菜单
    地毯文(立足根本的基础细节篇)
    按钮组 button group
    offices web apps server2013 部署
    appium学习
    python练习
    Jmeter分布式测试
    centos安装远程桌面
    进程与线程
  • 原文地址:https://www.cnblogs.com/wally/p/3072575.html
Copyright © 2011-2022 走看看