• 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 }
  • 相关阅读:
    loj6033.「雅礼集训 2017 Day2」棋盘游戏
    loj6032. 「雅礼集训 2017 Day2」水箱
    BZOJ 5217 [Lydsy2017省队十连测] 航海舰队
    P4173 残缺的字符串
    P3723 [AH2017/HNOI2017]礼物
    P3321 [SDOI2015]序列统计
    P4841 [集训队作业2013]城市规划
    MySQL基础
    MySQL查询
    HTTP响应码
  • 原文地址:https://www.cnblogs.com/wally/p/3072575.html
Copyright © 2020-2023  润新知