POJ 3694 Network(Tarjan求割邊+LCA)

来源:https://www.cnblogs.com/zwfymqz/archive/2018/02/27/8480796.html
-Advertisement-
Play Games

Network Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 10969 Accepted: 4096 Description A network administrator manages a large network. T ...


Network
Time Limit: 5000MS   Memory Limit: 65536K
Total Submissions: 10969   Accepted: 4096

Description

A network administrator manages a large network. The network consists of N computers and M links between pairs of computers. Any pair of computers are connected directly or indirectly by successive links, so data can be transformed between any two computers. The administrator finds that some links are vital to the network, because failure of any one of them can cause that data can't be transformed between some computers. He call such a link a bridge. He is planning to add some new links one by one to eliminate all bridges.

You are to help the administrator by reporting the number of bridges in the network after each new link is added.

Input

The input consists of multiple test cases. Each test case starts with a line containing two integers N(1 ≤ N ≤ 100,000) and M(N - 1 ≤ M ≤ 200,000).
Each of the following M lines contains two integers A and B ( 1≤ A ≠ B ≤ N), which indicates a link between computer A and B. Computers are numbered from 1 to N. It is guaranteed that any two computers are connected in the initial network.
The next line contains a single integer Q ( 1 ≤ Q ≤ 1,000), which is the number of new links the administrator plans to add to the network one by one.
The i-th line of the following Q lines contains two integer A and B (1 ≤ A ≠ B ≤ N), which is the i-th added new link connecting computer A and B.

The last test case is followed by a line containing two zeros.

Output

For each test case, print a line containing the test case number( beginning with 1) and Q lines, the i-th of which contains a integer indicating the number of bridges in the network after the first i new links are added. Print a blank line after the output for each test case.

Sample Input

3 2
1 2
2 3
2
1 2
1 3
4 4
1 2
2 1
2 3
1 4
2
1 2
3 4
0 0

Sample Output

Case 1:
1
0

Case 2:
2
0

Source

 

題目大意:

給出一張圖,詢問每次加邊之後圖中有多少割邊

 

首先我們來一遍tarjan

這樣實際上形成了一棵樹

對於每次詢問,我們找出它們的LCA

在往LCA走的過程中判斷是否是割邊,如果是就取消標記

LCA暴力就可以,父親節點的信息可以在tarjan的過程中得到

 

 

 

// luogu-judger-enable-o2
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
//#define getchar() (S == T && (T = (S = BB) + fread(BB, 1, 1 << 15, stdin), S == T) ? EOF : *S++)
//char BB[1 << 15], *S = BB, *T = BB;
using namespace std;
const int MAXN=1e6+10;
inline int read()
{
    char c=getchar();int x=0,f=1;
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    return x*f;
}
struct node
{
    int u,v,nxt;
}edge[MAXN];
int head[MAXN],num=1;
inline void AddEdge(int x,int y)
{
    edge[num].u=x;
    edge[num].v=y;
    edge[num].nxt=head[x];
    head[x]=num++;
}
int N,M;

int dfn[MAXN],low[MAXN],f[MAXN],deep[MAXN],tot=0;
int bridge[MAXN],ans=0;
void pre()
{
    for(int i=1;i<=N;i++) f[i]=i;
    memset(head,-1,sizeof(head));
    num=1;
    memset(dfn,0,sizeof(dfn));
    memset(low,0,sizeof(low));
    memset(bridge,0,sizeof(bridge));
    tot=0;
    ans=0;
}
void tarjan(int now,int fa)
{
    dfn[now]=low[now]=++tot;
    for(int i=head[now];i!=-1;i=edge[i].nxt)
    {
        if(!dfn[edge[i].v]) 
        {
            deep[edge[i].v]=deep[now]+1;
            f[edge[i].v]=now;
            tarjan(edge[i].v,now);
            low[now]=min(low[now],low[edge[i].v]);
            if(low[edge[i].v]>dfn[now])
            {
                bridge[edge[i].v]=1;
                ans++;
            }
        }    
        else if(edge[i].v!=fa) low[now]=min(low[now],dfn[edge[i].v]); 
    }
}
int Solve(int x,int y)
{
    if(deep[x]<deep[y]) swap(x,y);
    while(deep[x]!=deep[y])
    {
        if(bridge[x]) ans--,bridge[x]=0;
        x=f[x];    
    } 
    while(x!=y)
    {
        if(bridge[x]) ans--,bridge[x]=0;
        if(bridge[y]) ans--,bridge[y]=0;
        x=f[x];y=f[y];
    }
    return ans;
}
int main()
{
    #ifdef WIN32
    freopen("a.in","r",stdin);
    #else
    #endif
    int QWQ=0;
    while(scanf("%d%d",&N,&M)!=EOF)
    {
        if(N==0&&M==0) break;
        printf("Case %d:\n",++QWQ);
        pre();
        for(int i=1;i<=M;i++)
        {
            int x=read(),y=read();
            AddEdge(x,y);
            AddEdge(y,x);
        }
        deep[1]=1;
        tarjan(1,0);
        int Q=read();
        while(Q--)
        {
            int x=read(),y=read();
            printf("%d\n",Solve(x,y));
        }
        putchar('\n');
    }
    return 0;
}

 

 

 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • defaultdict函數將所有值初始化為指定類型 '' python按照引用傳遞 [1, 2, 3, 4] isinstance函數檢查對象是否為某個特定的類型 False is用來判斷兩份引用是否指向同一個對象與 == 不同 True 字元串左邊加上r表示字元應該按原本樣子解釋 e\\e str ...
  • 相信不少Springboot初學者和我一樣,都遇到上邊這個提示,明明路徑都是對的,但就是找不到對於的頁面而404了,這也困擾我很長一段時間,我也是不得其解,百度上也鮮有合理回答,因為以前使用的時候,明明一切都很正常,這也讓我疑神疑鬼了,一度懷疑是idea的問題,也重裝了,還建了很多次項目來實驗,這大 ...
  • Description 考慮正整數集合,現在有n組人依次來取數,假設第i組來了x人,他們每個取的數一定是x的倍數,並且是還剩下的最小的x個。正整數中有m個數被標成了幸運數,問有哪些人取到了幸運數。 考慮正整數集合,現在有n組人依次來取數,假設第i組來了x人,他們每個取的數一定是x的倍數,並且是還剩下 ...
  • 用戶模塊 要登陸後才能購買,因此我們先寫購買模塊. 設計實體 設計資料庫表 編寫DAO 測試DAO 抽取DAO 編寫Service 前臺樣式 head.jsp head.css 效果: 實現登陸註冊功能 當點擊登陸按鈕的時候,把數據帶過去給Servlet,讓Servlet調用BusinessServ ...
  • 介面的應用 介面是一種能力 關鍵字:interface 語法: 註:介面內,所有方法都沒有方法體 介面的特性: 介面不可以被實例化 常作為類型使用 實現類必須實現介面的所有方法 實現類可以實現多個介面 介面中的變數都是靜態常量 Java中的多繼承 生活中的介面: 電腦USB介面 引出: USB介面本 ...
  • Jewel Magic UVA - 11996 這是一道用splay/非旋treap做的題(這裡用的是非旋treap) 1/2/3是splay/非旋treap的常規操作。對於操作4,可以用哈希法求LCP。記hash(i,L)為子串[i,i+L-1](即第i個開始的L個)的hash值。記s[i]為序列 ...
  • 文件操作對於編程語言的重要性不言而喻,如果數據不能持久保存,信息技術也就失去了意義。 文件操作的內容包括打開文件,操作文件,關閉文件 一,打開文件 python中打開文件的函數為open('filename',mode='r',encode='None'),open函數預設返迴文件的句柄,我們可以根 ...
  • C++ 標準庫沒有提供所謂的日期類型。C++ 繼承了 C 語言用於日期和時間操作的結構和函數。 為了使用日期和時間相關的函數和結構,需要在 C++ 程式中引用 頭文件。 有四個與時間相關的類型:clock_t、time_t、size_t 和 tm。類型 clock_t、size_t 和 time_t ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...