題目描述
輸入輸出格式
輸入格式:
第一行:兩個用空格分開的整數:n和m
第二行到第m + 1行:每行兩個用空格分開的整數:a和b,表示a喜歡b
輸出格式:
第一行:單獨乙個整數,表示明星奶牛的數量
輸入輸出樣例
輸入樣例#1:
3 3
1 2
2 1
2 3
輸出樣例#1:
1 說明
只有 3 號奶牛可以做明星
【資料範圍】
10%的資料n<=20, m<=50
30%的資料n<=1000,m<=20000
70%的資料n<=5000,m<=50000
100%的資料n<=10000,m<=50000
tarjan暴力縮點,求出度為0的強連通分量的大小。
要格外注意的是,出度為0的強連通分量只能有乙個。也就是說,最後的答案是唯一乙個出度為0的明星集團的大小。
證明:
①:明星奶牛被所有牛喜歡,出度只能為0。若出度不為0,明星奶牛被所有牛喜歡的同時還喜歡著某個其它奶牛,那麼明星奶牛與其它奶牛之間就有一條雙向邊,又形成乙個明星集團,與已經找出的強連通分量衝突;
②:出度為0的強連通分量只能有乙個。如果不唯一,還有另乙個出度為0的強連通分量,那麼不符合「被其他所有牛喜歡」的條件。
因此如果找到多個明星集團,輸出0。
:tarjan板子真是打一次錯一次。
dfs寫錯時洛谷會卡乙個點。。竟然就乙個。。
#include
#include
#include
#include
#include
using
namespace
std;
const
int maxn=100000+10;
int first[maxn],nxt[maxn],tot;
int dfn[maxn],low[maxn],scc[maxn],size[maxn],chu[maxn];
int scc_num,dfs_clock;
int n,m,ans;
stack
s;struct edge
l[maxn];
void build(int f,int t)
; nxt[tot]=first[f];
first[f]=tot;
return;
}void dfs(int u)
else
if(!scc[w])
}if(low[u]==dfn[u])
}return;
}int main()
for(int i=1;i<=n;i++)
for(int i=1;i<=n;i++)
}int k;
for(int i=1;i<=scc_num;i++)
if(ans==1) cout
<'\n';
else
puts("0");
return
0;}
洛谷 2341 HAOI2006 受歡迎的牛
輸入輸出樣例 輸入樣例 1 3 31 2 2 12 3 輸出樣例 1 1說明 只有 3 號奶牛可以做明星 資料範圍 10 的資料n 20,m 50 30 的資料n 1000,m 20000 70 的資料n 5000,m 50000 100 的資料n 10000,m 50000 解釋 強聯通分量縮點,...
HAOI 2006 受歡迎的牛 (洛谷2341)
題目描述 每頭奶牛都夢想成為牛棚裡的明星。被所有奶牛喜歡的奶牛就是一頭明星奶牛。所有奶 歡b,b喜歡c,那麼a也喜歡c。牛欄裡共有n 頭奶牛,給定一些奶牛之間的愛慕關係,請你 算出有多少頭奶牛可以當明星。輸入輸出格式 輸入格式 第一行 兩個用空格分開的整數 n和m 第二行到第m 1行 每行兩個用空格...
HAOI 2006 受歡迎的牛 (洛谷2341)
題目描述 每頭奶牛都夢想成為牛棚裡的明星。被所有奶牛喜歡的奶牛就是一頭明星奶牛。所有奶 歡b,b喜歡c,那麼a也喜歡c。牛欄裡共有n 頭奶牛,給定一些奶牛之間的愛慕關係,請你 算出有多少頭奶牛可以當明星。輸入輸出格式 輸入格式 第一行 兩個用空格分開的整數 n和m 第二行到第m 1行 每行兩個用空格...