【基礎練習】【強連通tarjan】codevs4093 EZ的間諜網路題解
由於外國間諜的大量滲入,學校安全正處於高度的危機之中。YJY決定挺身而作出反抗。如果A間諜手中掌握著關於B間諜的犯罪證據,則稱A可以揭發B。有些間諜收受賄賂,只要給他們一定數量的美元,他們就願意交出手中掌握的全部情報。所以,如果我們能夠收買一些間諜的話,我們就可能控制間諜網中的每一分子。因為一旦我們逮捕了一個間諜,他手中掌握的情報都將歸我們所有,這樣就有可能逮捕新的間諜,掌握新的情報。
我們的神通廣大的YJY獲得了一份資料,色括所有已知的受賄的間諜,以及他們願意收受的具體數額。同時我們還知道哪些間諜手中具體掌握了哪些間諜的資料。假設總共有n個間諜(n不超過
請根據這份資料,判斷我們是否有可能控制全部的間諜,如果可以,求出我們所需要支付的最少資金。否則,輸出不能被控制的一個間諜。
輸入描述 Input Description第一行只有一個整數n。
第二行是整數p。表示願意被收買的人數,1≤p≤n。
接下來的p行,每行有兩個整數,第一個數是一個願意被收買的間諜的編號,第二個數表示他將會被收買的數額。這個數額不超過20000。
緊跟著一行只有一個整數r,1≤r≤8000。然後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]
——檻菊愁煙蘭泣露,羅幕輕寒,燕子雙飛去
相關推薦
【基礎練習】【強連通tarjan】codevs4093 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
【基礎練習】【線性DP】codevs3027 線段覆蓋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個火車站。每一個
【基礎練習】【區間DP】codevs1090 加分二叉樹題解
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語言的輸入輸
【基礎練習】【揹包DP】codevs1068 烏龜棋題解
小明過生日的時候,爸爸送給他一副烏龜棋當作禮物。 烏龜棋的棋盤是一行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
【基礎練習】【線性DP】codevs3641 上帝選人題解
這道題目的資料最後一個有問題,特殊處理了 上題目 題目描述 Description 世界上的人都有智商IQ和情商EQ。我們用兩個數字來表示人的智商和情商,數字大就代表其相應智商或情商高。現在你
藍橋杯 【基礎練習】 特殊迴文數
問題一:迴文數 問題描述 1221是一個非常特殊的數,它從左邊讀和從右邊讀是一樣的,程式設計求所有這樣的四位十進位制數。 輸出格式 按從小到大的順序輸出滿足條件的四位十進位制數。 思路:分別求出這個四位數的每一個位上的數,然後做比較 #include&l
【基礎練習】【模擬】codevs1704 卡片遊戲題解
題目描述 Description 桌面上有一疊牌,從第一張牌(即位於頂面的牌)開始從上往下依次編號為1~n.當至少還剩兩張排時進行一下操作:把第一張牌扔掉,然後把新的第一張牌放到整疊牌的最後。