hdu 5409 CRB and Graph(邊雙聯通分量)

來源:互聯網
上載者:User

標籤:記錄   col   時間   log   初始化   nbsp   back   color   for   

題意:

給一個圖一些邊,保證圖連通

問對於每條邊,如果去除該邊後使得圖中一些點不連通。設這些點(u,v),要求使u盡量小,v盡量大,輸出這樣的(u,v)。否則輸出0 0。

  1 #include <bits/stdc++.h>  2 using namespace std;  3 const int MAXN = 1e5 + 1;  4 typedef pair <int, int>pii;  5 vector<pii>G[MAXN];  6 bool isBridge[MAXN];  7 int clk, pre[MAXN], low[MAXN];  8 int IDX, maxv[MAXN], newIdx[MAXN], newMax[MAXN];  9 int U[MAXN], V[MAXN]; 10 int ans[MAXN]; 11 bool vis[MAXN]; 12 int n, m; 13  14 void init () { 15     memset(isBridge, false, sizeof (isBridge)); //記錄橋 16     memset(pre, 0, sizeof (pre));   //記錄的第一次訪問的時間戳記 17     memset(low, 0, sizeof (low));   //本身及其子節點能回到的最早的祖先的pre值 18     clk = 0;    //時間戳記 19     for (int i = 0; i < MAXN; i++) { 20         G[i].clear(); 21     } 22 } 23  24 void DFS (int u, int pa) { 25     int lowu = pre[u] = ++clk; 26     for (int i = 0; i < G[u].size(); i++) { 27         pii e = G[u][i]; 28         int v = e.first; 29         int idx = e.second; 30         if (!pre[v]) { 31             DFS(v, u); 32             lowu = min(lowu, low[v]); 33             if (low[v] > pre[u]) { 34                 isBridge[idx] = true; 35             } 36         } else if (pre[v] < pre[u] && v != pa) { 37             //是反向邊更新lowu 38             lowu = min(lowu, pre[v]); 39         } 40     } 41     low[u] = lowu;  //更改low[u] 42 } 43  44 void DFS2(int u, int pa) { 45     vis[u] = true; 46     maxv[u] = u; 47     newIdx[u] = IDX; 48     for (int i = 0; i < G[u].size(); i++) { 49         pii e = G[u][i]; 50         int v = e.first; 51         int idx = e.second; 52         if (!isBridge[idx] && v != pa && !vis[v]) { 53             DFS2(v, u); 54             maxv[u] = max(maxv[u], maxv[v]); 55         } 56     } 57 } 58  59 void BCC_Bridge() { 60     DFS(1, -1); //記錄橋 61     memset(vis, false, sizeof (vis)); 62     IDX = 0; 63     for (int i = 1; i <= n; i++) { 64         if (!vis[i]) { 65             IDX++; 66             DFS2(i, -1);    //縮點 67         } 68     } 69     //重新記錄縮後的點 70     for (int i = 1; i <= n; i++) { 71         G[i].clear(); 72     } 73     for (int i = 0; i < m; i++) { 74         if (isBridge[i]) { 75             int u = newIdx[U[i]], v = newIdx[V[i]]; 76             G[u].push_back(make_pair(v, i)); 77             G[v].push_back(make_pair(u, i)); 78         } 79     } 80 } 81  82 void solve (int u, int pa) { 83     pre[u] = ++clk; 84     ans[u] = newMax[u]; 85     for (int i = 0; i < G[u].size(); i++) { 86         int v = G[u][i].first; 87         if (v != pa) { 88             solve(v, u); 89             ans[u] = max(ans[u], ans[v]); 90         } 91     } 92 } 93  94 int main() { 95     int T; 96     scanf ("%d", &T); 97     while (T--) { 98         init(); //進行初始化 99         scanf ("%d%d", &n, &m);100         for (int i = 0; i < m; i++) {101             int u, v;102             scanf ("%d%d", &u, &v);103             U[i] = u, V[i] = v;104             G[u].push_back(make_pair(v, i));105             G[v].push_back(make_pair(u, i));106         }107         BCC_Bridge();108         for (int i = 1; i <= n; i++) {109             newMax[newIdx[i]] = maxv[i];110         }111         int u;112         for (u = 1; u <= n; u++) {113             if (newMax[u] == n) {114                 break;115             }116         }117         memset(pre, 0, sizeof pre);118         clk = 0;    //重新定義時間戳記119         solve (u, 0);120         for (int i = 0; i < m; i++) {121             int u = newIdx[U[i]],  v = newIdx[V[i]];122             if (u == v) {123                 printf("0 0\n");124             } else {125                 if (pre[u] < pre[v]) {126                     swap(u, v);127                 }128                 printf("%d %d\n", ans[u], ans[u]+1);129             }130         }131     }132     return 0;133 }

 

hdu 5409 CRB and Graph(邊雙聯通分量)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.