1. 程式人生 > >【基礎練習】【強連通tarjan】codevs4093 EZ的間諜網路題解

【基礎練習】【強連通tarjan】codevs4093 EZ的間諜網路題解

題目描述 Description

由於外國間諜的大量滲入,學校安全正處於高度的危機之中。YJY決定挺身而作出反抗。如果A間諜手中掌握著關於B間諜的犯罪證據,則稱A可以揭發B。有些間諜收受賄賂,只要給他們一定數量的美元,他們就願意交出手中掌握的全部情報。所以,如果我們能夠收買一些間諜的話,我們就可能控制間諜網中的每一分子。因為一旦我們逮捕了一個間諜,他手中掌握的情報都將歸我們所有,這樣就有可能逮捕新的間諜,掌握新的情報。

  我們的神通廣大的YJY獲得了一份資料,色括所有已知的受賄的間諜,以及他們願意收受的具體數額。同時我們還知道哪些間諜手中具體掌握了哪些間諜的資料。假設總共有n個間諜(n不超過

3000),每個間諜分別用13000的整數來標識。

  請根據這份資料,判斷我們是否有可能控制全部的間諜,如果可以,求出我們所需要支付的最少資金。否則,輸出不能被控制的一個間諜。

輸入描述 Input Description

第一行只有一個整數n

  第二行是整數p。表示願意被收買的人數,1pn

  接下來的p行,每行有兩個整數,第一個數是一個願意被收買的間諜的編號,第二個數表示他將會被收買的數額。這個數額不超過20000

  緊跟著一行只有一個整數r1r8000。然後r行,每行兩個正整數,表示數對(A, B)A間諜掌握B間諜的證據。

輸出描述 Output Description

如果可以控制所有間諜,第一行輸出YES,並在第二行輸出所需要支付的賄金最小值。否則輸出NO,並在第二行輸出不能控制的間諜中,編號最小的間諜編號。

樣例輸入 Sample Input

【樣例1

3

2

1 10

2 100

2

1 3

2 3

【樣例2

4

2

1 100

4 200

2

1 2

3 4

樣例輸出 Sample Output

【樣例1

YES

110

【樣例2

NO<a name="_GoBack"></a>

3

資料範圍及提示 Data Size & Hint

各個測試點1s

友情提示:請先膜拜下萬能的YJY再做呦^_^

對於每個環,環內任意一個元素可以揭發其他所有人 因此只需要把環縮成一點 這點的權值為環上點權值的最小值

如果遇到一條鏈,由於我們的目的是把所有的間諜都控制,因此必須控制鏈的起點元素。

在環縮點之後,凡是入度為0的點,要麼是獨立的點,要麼是鏈的起始點;同時,所有需要被控制的點,即鏈的起始點和獨立點,必然入度為0。因此只需統計入度為零的點權值和。

如果縮點後存在不能被控制的入度為0的點 則需要找出不能控制的點中最小的一個。因此我們在縮點時同時記錄這個環中編號最小點,並將不能控制的點權值賦值為極大值。最後我們掃一遍求得編號最小的點即可。

這道題目即使是10s的時間鄙人還是狂T不止。最後試出資料,發現還是錯在了低階錯誤上。遍歷邊的時候竟然寫的是i=next[x]而不是i=next[i],因此i的值始終卡在一個值上,當然會死迴圈。

程式碼

//codevs4093 EZ的間諜網路 tarjan
//copyright by ametake
//task:首先縮點 並把點值賦值為最小代價 然後重構圖統計入度 對入度為0的點求和 
#include
#include
#include
#include
using namespace std;

const int maxn=3000+10;
const int maxm=8000+10;

int n,p,r;
int hd[maxn],tt[maxm*2],nxt[maxm*2],et;
int money[maxn],fin[maxn];
int dfn[maxn],low[maxn],dep=0;
int inwhich[maxn],sta[maxn],stp=0;
bool ins[maxn],ok,ru[maxn][maxn];
int tot,ans,rudu[maxn],mip[maxn]; 

int read()
{
    int a=0;
    int f=1;
    char ch=getchar();
    while (ch>'9'||ch<'0')
    {
        if (ch=='-') f=-1;
        ch=getchar();
    }
    while (ch<='9'&&ch>='0')
    {
        a=a*10+ch-'0';
        ch=getchar();
    }
    a*=f;
    return a;
}

void add(int x,int y)
{
    et++;
    tt[et]=y;
    nxt[et]=hd[x];
    hd[x]=et;
}


void tarjan(int x)
{
    dfn[x]=low[x]=++dep;
    ins[x]=true;
    sta[++stp]=x;
    for (int i=hd[x];i!=0;i=nxt[i])
    {
        if (!dfn[tt[i]])
        {
            tarjan(tt[i]);
            low[x]=min(low[x],low[tt[i]]);
        }
        else if (ins[tt[i]])
        {
            low[x]=min(low[x],dfn[tt[i]]);
        }
    }
    if (dfn[x]==low[x])
    {
        int j;
        tot++;
        int minn=0x3f3f3f,mij=0x3f3f3f;
        do
        {
            j=sta[stp--];
            ins[j]=false;
            inwhich[j]=tot;
            mij=min(mij,j);
            if (money[j]

——檻菊愁煙蘭泣露,羅幕輕寒,燕子雙飛去

相關推薦

基礎練習連通tarjancodevs4093 EZ間諜網路題解

題目描述 Description 由於外國間諜的大量滲入,學校安全正處於高度的危機之中。YJY決定挺身而作出反抗。如果A間諜手中掌握著關於B間諜的犯罪證據,則稱A可以揭發B。有些間諜收受賄賂,只要給他們一定數量的美元,他們就願意交出手中掌握的全部情報。所以,如果我們

Tarjan算法連通分量

HR 得出 強連通 遍歷 str 時間復雜度 滿足 ack ID 轉自:byvoid:有向圖強連通分量的Tarjan算法 Tarjan算法是基於對圖深度優先搜索的算法,每個強連通分量為搜索樹中的一棵子樹。搜索時,把當前搜索樹中未處理的節點加入一個堆棧,回溯時可以判斷棧頂到

Tarjan連通分量 BZOJ 5201 —— Connections

對於每一個節點,我們保留一條樹邊,以及最多一條返祖邊.注意這條返祖邊要指向儘可能高的位置.這樣下來保留的邊數一定小於等於2∗n2*n2∗n,並且滿足圖依舊是強連通的.至於為什麼,貪心的想一想.既然之前

hdu 4685 Prince and Princess 匈牙利演算法-匹配、連通分量-Tarjan-縮點

Prince and Princess Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java

學習Tarjan連通分量

       正題之前嘮嘮幾句,寫這篇部落格的原因是因為做到了一道圖論題,發現顯然需要縮點解決,但是發現自己圖論中的縮點基本忘完了,同時與之相關的Tarjan求SCC(強連通分量Strong Connected Component)也不記得多少,才想著把圖論當中的Tarjan

基礎練習線性DPcodevs3027 線段覆蓋2題解

嚴重 weight 代碼 -c -h scrip trac tput adding 文章被盜還是非常嚴重,加版權信息 轉載請註明出處 [ametake版權全部]http://blog.csdn.net/ametake歡迎來看看 這道題目是線性動歸

基礎練習BFS+A*codevs1225八數碼難題題解

一點 說明 優先 data- push 練習 bool csdn tarjan 題目描寫敘述 Description Yours和zero在研究A*啟示式算法.拿到一道經典的A*問題,可是他們不會做,請你幫他們. 問題描寫敘述 在3×3的棋

基礎練習拓撲排序codevs3294 車站分級題解

線上 inpu tom code spa bre 必須 處理 snippets 題目來源:NOIP2013 普及第四題 題目描寫敘述 Description 一條單向的鐵路線上,依次有編號為1, 2, …, n的n個火車站。每一個

基礎練習區間DPcodevs1090 加分二叉樹題解

border style script 全部 靈魂 noip 初始 mar 出現 2003 NOIP TG 題目描寫敘述 Description 設一個n個節點的二叉樹tree的中序遍歷為(l,2,3,…,n),當中數字1,2,3,…,n為節點編

[NOIP2017] 逛公園 最短路連通分量

size def con tar 出現 typedef esp pair string 題目分析: 首先考慮無數條的情況。出現這種情況一定是一條合法路徑經過了$ 0 $環中的點。那麽預先判出$ 0 $環中的點和其與$ 1 $和$ n $的距離。加起來若離最短路徑不超過$ k

hdu 1269 迷宮城堡連通模板

Problem Description 為了訓練小希的方向感,Gardon建立了一座大城堡,裡面有N個房間(N<=10000)和M條通道(M<=100000),每個通道都是單向的,就是說若稱某通道連通了A房間和B房間,只說明可以通過這個通道由A房間到達B房間,但並不說明通過它可以由B房間

藍橋杯基礎練習十六進位制轉十進位制、八進位制

十六進位制轉十進位制 問題描述   從鍵盤輸入一個不超過8位的正的十六進位制數字符串,將它轉換為正的十進位制數後輸出。   注:十六進位制數中的10~15分別用大寫的英文字母A、B、C、D、E、F表示。 樣例輸入 FFFF 樣例輸出 65535 方法一:巧用C語言的輸入輸

基礎練習揹包DPcodevs1068 烏龜棋題解

小明過生日的時候,爸爸送給他一副烏龜棋當作禮物。 烏龜棋的棋盤是一行N個格子,每個格子上一個分數(非負整數)。棋盤第1格是唯一 的起點,第N格是終點,遊戲要求玩家控制一個烏龜棋子從起點出發走到終點。 …… 1 2 3 4 5 ……N 烏龜棋中M張爬行卡片,分成4種不同的型別(M張卡片中不一定包含所有4種類型

基礎練習模擬Uva133

有點點像約瑟夫的變式 注意函式形參要用逗號隔開 這個題目中ruka提供的處理環的方法很有用 可以學習一下 再一個就是出圈後相應位置賦值為零很方便 程式碼放上: #include<cstdio&

2017 烏魯木齊賽區網路賽 Islands(連通問題縮點+點連通分量

題目連結:https://nanti.jisuanke.com/t/16955 【中文題意】給你一個有向圖,然後讓你加最少的邊使得全圖強連通(即從任意一個點出發,可以到達剩餘的所有點)。 【思路分析】非常經典的板子題。先找強連通分量,然後縮點後求邊的條數。

基礎練習組合數+快速冪codevs1137 計算係數題解

非常簡單的一道題目 可是編譯器總是出問題= = 轉載請註明出處 CSDN ametake版權所有 題目 題目描述 Description 給定一個多項式(ax + by)^k,請求出多項式

基礎練習結構體定義比較函式雙關鍵字排序

題目好長顯得很高大上的樣子其實一點也不是這樣= = 再次感謝里奧同學的友情支援,沒有他我現在還在一片雲裡霧裡。 之前看ruka上一直說:可以自定義排序,但必須自定義小於號或者是比較函式,一直苦於如何實踐,今天請教了里奧同學,終於撥雲見日。 這樣的題有很多類似的,像是code

基礎練習線性DPcodevs3641 上帝選人題解

這道題目的資料最後一個有問題,特殊處理了 上題目 題目描述 Description 世界上的人都有智商IQ和情商EQ。我們用兩個數字來表示人的智商和情商,數字大就代表其相應智商或情商高。現在你

藍橋杯 基礎練習 特殊迴文數

問題一:迴文數 問題描述   1221是一個非常特殊的數,它從左邊讀和從右邊讀是一樣的,程式設計求所有這樣的四位十進位制數。 輸出格式   按從小到大的順序輸出滿足條件的四位十進位制數。 思路:分別求出這個四位數的每一個位上的數,然後做比較 #include&l

基礎練習模擬codevs1704 卡片遊戲題解

題目描述 Description 桌面上有一疊牌,從第一張牌(即位於頂面的牌)開始從上往下依次編號為1~n.當至少還剩兩張排時進行一下操作:把第一張牌扔掉,然後把新的第一張牌放到整疊牌的最後。