2#include3#include4#include5#include

亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

BZOJ 1093 [ZJOI2007]最大半連通子圖

系統(tǒng) 1820 0

以前做過poj的一個判斷圖是否為弱連通的題,然后,這個題和poj那個差不多。

先強連通縮點,然后重新構(gòu)圖,然后找出包含點數(shù)最多的 ,統(tǒng)計個數(shù)即可,可以用拓撲排序搞~

?

pS:重新構(gòu)圖時有重邊,然后導致統(tǒng)計方案數(shù)的重復。。wa了好久。。還是wzc神犇告訴我這個蒟蒻的。。

?

View Code
        
            1
        
         #include <iostream>


        
            2
        
         #include <cstdio>


        
            3
        
         #include <cstdlib>


        
            4
        
         #include <cstring>


        
            5
        
         #include <algorithm>


        
            6
        
        
            7
        
        
          #define
        
         N 200000


        
            8
        
        
          #define
        
         M 5000000


        
            9
        
        
          #define
        
         BUG system("pause")


        
           10
        
        
           11
        
        
          using
        
        
          namespace
        
        
           std;


        
        
           12
        
        
           13
        
        
          int
        
        
           head[N],to[M],next[M];


        
        
           14
        
        
          int
        
        
           dfn[N],low[N];


        
        
           15
        
        
          int
        
        
           st[M],ed[M];


        
        
           16
        
        
          int
        
        
           n,m,cnt,ans,ansnum,mod;


        
        
           17
        
        
          int
        
        
           divg,belong[N],t,p,stk[N],val[N];


        
        
           18
        
        
          bool
        
        
           fg[N];


        
        
           19
        
        
          int
        
         num[N],
        
          in
        
        
          [N],dp[N],q[M],vis[N];


        
        
           20
        
        
           21
        
         inline 
        
          void
        
         add(
        
          int
        
         u,
        
          int
        
        
           v)


        
        
           22
        
        
          {


        
        
           23
        
             to[cnt]=v; next[cnt]=head[u]; head[u]=cnt++
        
          ;


        
        
           24
        
        
          }


        
        
           25
        
        
           26
        
         inline 
        
          void
        
        
           read()


        
        
           27
        
        
          {


        
        
           28
        
             memset(head,-
        
          1
        
        ,
        
          sizeof
        
         head); cnt=
        
          0
        
        
          ;


        
        
           29
        
             scanf(
        
          "
        
        
          %d%d%d
        
        
          "
        
        ,&n,&m,&
        
          mod);


        
        
           30
        
        
          for
        
        (
        
          int
        
         i=
        
          1
        
        ;i<=m;i++
        
          )


        
        
           31
        
        
              {


        
        
           32
        
                 scanf(
        
          "
        
        
          %d%d
        
        
          "
        
        ,&st[i],&
        
          ed[i]);


        
        
           33
        
        
                  add(st[i],ed[i]);


        
        
           34
        
        
              }


        
        
           35
        
        
          }


        
        
           36
        
        
           37
        
         inline 
        
          void
        
         dfs(
        
          int
        
        
           u)


        
        
           38
        
        
          {


        
        
           39
        
             low[u]=dfn[u]=++
        
          t;


        
        
           40
        
             stk[++p]=u; fg[u]=
        
          true
        
        
          ;


        
        
           41
        
        
          for
        
        (
        
          int
        
         i=head[u];~i;i=
        
          next[i])


        
        
           42
        
        
              {


        
        
           43
        
        
          if
        
        (!
        
          dfn[to[i]])


        
        
           44
        
        
                  {


        
        
           45
        
        
                      dfs(to[i]);


        
        
           46
        
                     low[u]=
        
          min(low[u],low[to[i]]);


        
        
           47
        
        
                  }


        
        
           48
        
        
          else
        
        
          if
        
        (fg[to[i]]) low[u]=
        
          min(low[u],dfn[to[i]]);


        
        
           49
        
        
              }


        
        
           50
        
        
          if
        
        (dfn[u]==
        
          low[u])


        
        
           51
        
        
              {


        
        
           52
        
                 divg++
        
          ;


        
        
           53
        
        
          int
        
         tmp=-
        
          1
        
        
          ;


        
        
           54
        
        
          while
        
        (tmp!=
        
          u)


        
        
           55
        
        
                  {


        
        
           56
        
                     tmp=stk[p--
        
          ];


        
        
           57
        
                     belong[tmp]=
        
          divg;


        
        
           58
        
                     val[divg]++
        
          ;


        
        
           59
        
                     fg[tmp]=
        
          false
        
        
          ;


        
        
           60
        
        
                  }


        
        
           61
        
        
              }


        
        
           62
        
        
          }


        
        
           63
        
        
           64
        
         inline 
        
          void
        
        
           topsort()


        
        
           65
        
        
          {


        
        
           66
        
        
          int
        
         h=
        
          1
        
        ,t=
        
          1
        
        
          ,u;


        
        
           67
        
        
          for
        
        (
        
          int
        
         i=
        
          1
        
        ;i<=divg;i++
        
          )


        
        
           68
        
        
          if
        
        (
        
          in
        
        [i]==
        
          0
        
        
          )


        
        
           69
        
        
                  {


        
        
           70
        
                     q[t++]=
        
          i;


        
        
           71
        
                     dp[i]=
        
          val[i];


        
        
           72
        
                     num[i]=
        
          1
        
        
          ;


        
        
           73
        
        
                  }


        
        
           74
        
        
          while
        
        (h<
        
          t)


        
        
           75
        
        
              {


        
        
           76
        
                 u=q[h++
        
          ];


        
        
           77
        
        
          for
        
        (
        
          int
        
         i=head[u];~i;i=
        
          next[i])


        
        
           78
        
        
                  {


        
        
           79
        
        
          in
        
        [to[i]]--
        
          ;


        
        
           80
        
        
          if
        
        (
        
          in
        
        [to[i]]==
        
          0
        
        ) q[t++]=
        
          to[i];


        
        
           81
        
        
          if
        
        (vis[to[i]]==u) 
        
          continue
        
        ;
        
          //
        
        
          有重邊!! 
        
        
           82
        
        
          if
        
        (dp[to[i]]<dp[u]+
        
          val[to[i]])


        
        
           83
        
        
                      {


        
        
           84
        
                         dp[to[i]]=dp[u]+
        
          val[to[i]];


        
        
           85
        
                         num[to[i]]=
        
          num[u];


        
        
           86
        
        
                      }


        
        
           87
        
        
          else
        
        
          if
        
        (dp[to[i]]==dp[u]+
        
          val[to[i]])


        
        
           88
        
        
                      {


        
        
           89
        
                         num[to[i]]=(num[to[i]]+num[u])%
        
          mod;


        
        
           90
        
        
                      }


        
        
           91
        
                     vis[to[i]]=
        
          u;


        
        
           92
        
        
                  }


        
        
           93
        
        
              }


        
        
           94
        
        
          }


        
        
           95
        
        
           96
        
         inline 
        
          void
        
        
           go()


        
        
           97
        
        
          {


        
        
           98
        
        
          for
        
        (
        
          int
        
         i=
        
          1
        
        ;i<=n;i++
        
          )


        
        
           99
        
        
          if
        
        (!
        
          dfn[i]) dfs(i);


        
        
          100
        
             memset(head,-
        
          1
        
        ,
        
          sizeof
        
         head); cnt=
        
          0
        
        
          ;


        
        
          101
        
        
          for
        
        (
        
          int
        
         i=
        
          1
        
        ;i<=m;i++
        
          )


        
        
          102
        
        
          if
        
        (belong[st[i]]!=
        
          belong[ed[i]])


        
        
          103
        
        
                  {


        
        
          104
        
        
                      add(belong[st[i]],belong[ed[i]]);


        
        
          105
        
        
          in
        
        [belong[ed[i]]]++
        
          ;


        
        
          106
        
        
                  }


        
        
          107
        
        
              topsort();


        
        
          108
        
        
          for
        
        (
        
          int
        
         i=
        
          1
        
        ;i<=divg;i++
        
          )


        
        
          109
        
        
              {


        
        
          110
        
        
          if
        
        (dp[i]>
        
          ans)


        
        
          111
        
        
                  {


        
        
          112
        
                     ans=
        
          dp[i];


        
        
          113
        
                     ansnum=
        
          num[i];


        
        
          114
        
        
                  }


        
        
          115
        
        
          else
        
        
          if
        
        (dp[i]==ans) ansnum=(ansnum+num[i])%
        
          mod;


        
        
          116
        
        
              }


        
        
          117
        
             printf(
        
          "
        
        
          %d\n%d\n
        
        
          "
        
        
          ,ans,ansnum);


        
        
          118
        
        
          }


        
        
          119
        
        
          120
        
        
          int
        
        
           main()


        
        
          121
        
        
          {


        
        
          122
        
        
              read();


        
        
          123
        
        
              go();


        
        
          124
        
        
          return
        
        
          0
        
        
          ;


        
        
          125
        
         }
      

?

?

BZOJ 1093 [ZJOI2007]最大半連通子圖


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 5g影院天天爽 | 成人老司机深夜福利久久 | 国产精品久久久久久永久牛牛 | 免费看特级毛片 | 99pao在线视频精品免费 | 久久免费视频在线观看30 | 精品日本久久久久久久久久 | 久热免费 | 九九综合九九综合 | 亚洲第一黄色网址 | 精品日产一区二区 | 9久久这里只有精品国产 | a在线观看免费 | 99久久精品免费看国产交换 | 欧美亚洲综合一区 | 天堂亚洲国产日韩在线看 | 性猛交╳xxx乱大交 性猛交毛片 | 亚洲黄页| 国产精品视频免费播放 | 日韩欧美区 | jizz中国妇女| 久久日韩 | 一区两区三不卡 | 国产精品久久一区 | 久久精品午夜视频 | 久久久久国产免费 | 亚洲欧美中日韩 | 免费看一级大片 | 精品久久免费视频 | 免费一级毛片不卡在线播放 | 一区二区三区www | 一级毛片a女人刺激视频免费 | 久久婷婷人人澡人人爱91 | 一区二区三区在线视频观看 | 亚洲精品亚洲九十七页 | 超碰小说 | 奇米影视777me | 国产一区二区三区欧美精品 | 不卡免费视频 | 很狠操| 日本不卡一区二区三区 |