• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            a tutorial on computer science

              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
              21 隨筆 :: 0 文章 :: 17 評論 :: 0 Trackbacks
            一種很簡潔的寫法,那個用棧存的算法實在是比較難看。
            問題大概是這樣子的:
            無向圖割點:比較特殊,因為可能子節點從別的路返回到父親點,如果父親點再從自己返回到更高的父親點。。所以
            low[father] = 
            minst{
               dfn[father],
               low[child],
               dfn[others]
            };

            無向圖割邊:還可以用上面的公式,對于邊u->v,如果low[v] < dfn[u],我們可以認為這是割邊

            無向圖邊雙聯通:
            low[father] =
            minst{
            dfn[father],
            low[others],除了返回父親的邊
            }
            至于為什么會這樣,畫個圖理解下就好

            有向圖強聯通:
            和無向圖邊雙聯通是一樣的,這是不對的??!還沒想到好的辦法,還得用tarjan算法搞。

            無向圖點雙聯通:
            用求割點的那個公式,dfs把點放到棧里面,當dfn[u] == low[u]的時候出棧,棧里面的點在一個點雙聯通里,記得把當前點留在棧里


            //無向圖邊雙連通+縮點,已知圖是個聯通圖 

            #include <cstdio>
            #include <algorithm>
            #include <vector>
            #include <cstring>

            using namespace std;

            const int maxn = 5010;
            int nmap[maxn][maxn];

            vector<int> edg[maxn];

            int dfn[maxn],vis[maxn],low[maxn];

            int deg[maxn];

            int N,M;

            int t;

            void dfs(int p,int i)
            {
              vis[i] = 1;
              dfn[i] = low[i] = ++t;

              for(int j = 0;j<edg[i].size();j++)
              {
            int next = edg[i][j];
            if(next == p) continue;
                if(!vis[next])
                {
                   dfs(i,next);
                }
                low[i] = min(low[i],low[next]);
              } 
              vis[i] = 2; 
            }

            int main()
            {
              //freopen("in.txt","r",stdin);
              
            //freopen("out.txt","w",stdout);
              scanf("%d%d",&N,&M);
              int i,a,b;
              for(i=0;i<M;i++)
              {
                scanf("%d%d",&a,&b);
                if(nmap[a][b]) continue;
                edg[a].push_back(b);
                edg[b].push_back(a);
                nmap[a][b] = 1;
              }
              dfs(1,1);
              int leaf = 0; 
              for(i=1;i<=N;i++)
              {
                for(int j=0;j<edg[i].size();j++)
                {
                  if(low[i] != low[edg[i][j]])
                    deg[low[i]]++;
                }
              }
              for(i=1;i<=t;i++)
              {
               if(deg[i] == 1) leaf++;
              }
              printf("%d\n",(leaf+1)/2);
              return 0;
            }

                  
            posted on 2012-10-24 22:47 bigrabbit 閱讀(524) 評論(0)  編輯 收藏 引用
            久久精品亚洲中文字幕无码麻豆| 亚洲色婷婷综合久久| 无码国产69精品久久久久网站| 无码人妻精品一区二区三区久久久 | 久久乐国产综合亚洲精品| 欧美精品丝袜久久久中文字幕| 伊人色综合久久天天人守人婷 | 久久久久综合网久久| 久久91综合国产91久久精品| 久久久无码人妻精品无码| 99久久精品国产一区二区蜜芽 | 亚洲AV伊人久久青青草原| 一级做a爰片久久毛片免费陪| 超级97碰碰碰碰久久久久最新| 国产A三级久久精品| 久久夜色tv网站| 色青青草原桃花久久综合| 国内精品久久久久影院优| 亚洲人成网站999久久久综合 | 东方aⅴ免费观看久久av| 9999国产精品欧美久久久久久| 欧美麻豆久久久久久中文| 婷婷久久综合九色综合98| 偷窥少妇久久久久久久久| 国产成人久久精品二区三区| 无码AV波多野结衣久久| 热久久最新网站获取| 欧美精品一区二区精品久久 | 久久久久亚洲AV无码专区桃色| 亚洲乱码中文字幕久久孕妇黑人| 久久97久久97精品免视看秋霞 | 国产精品热久久无码av| 国产午夜精品理论片久久影视 | 国产精品一久久香蕉国产线看观看| 久久高清一级毛片| 青青青青久久精品国产| 久久婷婷国产麻豆91天堂| 精品久久香蕉国产线看观看亚洲 | 香港aa三级久久三级老师2021国产三级精品三级在 | 久久综合伊人77777| 久久亚洲国产成人影院网站 |