原題來自:usaco 2003 fall
第一行:兩個用空格分開的整數:nnn 和 mmm。
接下來 mmm 行:每行兩個用空格分開的整數:aaa 和 bbb,表示 aaa 喜歡 bbb。
一行單獨乙個整數,表示明星奶牛的數量。
輸入 #1
3 3輸出 #11 22 1
2 3
1只有 3號奶牛可以做明星。
emmmm
這是一到極為經典的,似乎是這一類題的模板的題目:縮點
縮點,也是tarjan的極大的乙個作用。
縮點只對強聯通分量有用,因為強聯通分量中的點可以互相到達,可以被視為乙個點。
這題,是肯定是有環的。
那麼肯定是很不好去實現遍歷的。
怎麼辦呢?
根據常識,環上的點肯定都在同乙個強聯通分量中。
強聯通分量 -->縮點
經過縮點的圖,一定是乙個有向無環圖
那麼只需要乙個dfs就好了啊awa
簡單題awa
淦,題解寫完了,**還沒寫。。。
等等我寫完**awa
#include#define ll long longn年前的草稿總算是發布了awausing
namespace
std;
struct
edge
e[1000001
];int head[1000001],n,m,w[1000001],tot,ccs,dfsc,low[1000001],dfn[1000001],color[10000001],cnt[1000001],de[1000001],all[1000001];bool vis[1000001
];stack
stk;
inline ll read()
void add(int i,int
j)void tarjan(int x,int
fa)
else
if(vis[u]==true
)
}if(dfn[x]==low[x])
while(x!=k);
}}int
main()
for(int i=1;i<=n;i++)
}//for(int i=1;i<=n;i++)
//for(int i=1;i<=n;i++)}}
int ans=0,sum=0;bool tt=0
;
for(int i=1;i<=ccs;i++)
tt=i;}}
cout
return0;
}
tarjan 受歡迎的牛
題 既然愛慕關係可以傳遞,那麼將互相可達的某幾個點縮成乙個點,就能簡化原圖了,那麼很自然想到tarjan求強連通分量 那麼就只需找到可以被所有縮點遍歷到的那個縮點 再輸出它所含的點數就行了 先用tarjan將所有聯通分量進行縮點,縮點後考慮出度為0的點的個數 1 個數大於1的時候,顯然不存在受歡迎的...
受歡迎的牛(tarjan)
題目連線 每一頭牛的願望就是變成一頭最受歡迎的牛。現在有n頭牛,給你m對整數 a,b 表示牛a認為牛b受歡迎。這種關係是具有傳遞性的,如果a認為b受歡迎,b認為c受歡迎,那麼牛a也認為牛c受歡迎。你的任務是求出有多少頭牛被所有的牛認為是受歡迎的。第一行兩個數n,m。接下來m行,每行兩個數a,b,意思...
受歡迎的牛 Tarjan
每一頭牛的願望就是變成一頭最受歡迎的牛。現在有 頭牛,給你 對整數 表示牛 認為牛 受歡迎。這種關係是具有傳遞性的,如果 認為 受歡迎,認為 受歡迎,那麼牛 也認為牛 受歡迎。你的任務是求出有多少頭牛被除自己之外的所有牛認為是受歡迎的。輸入格式 第一行兩個數 接下來 行,每行兩個數 意思是 認為 是...