題目直接擺在這裡!
time limit: 10 sec memory limit: 162 mb
submit: 4438 solved: 2353
[submit][status][discuss]
每一頭牛的願望就是變成一頭最受歡迎的牛。現在有n頭牛,給你m對整數(a,b),表示牛a認為牛b受歡迎。 這
種關係是具有傳遞性的,如果a認為b受歡迎,b認為c受歡迎,那麼牛a也認為牛c受歡迎。你的任務是求出有多少頭
牛被所有的牛認為是受歡迎的。
第一行兩個數n,m。 接下來m行,每行兩個數a,b,意思是a認為b是受歡迎的(給出的資訊有可能重複,即有可
能出現多個a,b)
乙個數,即有多少頭牛被所有的牛認為是受歡迎的。
3 31 2
2 12 3
1100%的資料n<=10000,m<=50000
[submit][status][discuss]
這道題和codevs2822愛在心中類似,也是一道tarjan練手題,所以具體的tarjan板子我就不再貼出來了。
這道題的思路也可以和codevs2822一樣的,使用tarjan+spfa,但是由於本人太懶,不想再打140行**,就換了另一種思路。
正解:tarjan縮點
具體做法:
第一步,先讀入資料建邊;
第二步,開始跑tarjan,別忘記在tarjan過程中要縮點,接下來的過程要用到。(所謂縮點,就是把每個點都歸到乙個強聯通塊裡面,對強聯通塊進行操作)
第三步:根據m個邊的關係,統計每個強聯通塊的出度。
第四步:統計出度為0的強聯通塊的個數,若為1,則輸出次強聯通塊組成元素個數,否則輸出0。(這裡才是這道題目核心的思想,想一想為什麼,其實很簡單)。
先貼上**(建議大家不要用vector這種東西,資料結構盡量手寫)
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8using
namespace
std;
9int
get_num()
21const
int maxn = 1e4 + 5;22
const
int maxm = 5e4 + 5;23
intn,m,h[maxn],sccno[maxn],scc_cnt,id[maxn],sum,r[maxn],dfn[maxn],low[maxn],dfs_clock,ans,pos;
24 stacks;
25struct
edgeedges[maxm << 1
];28
void addedge(int u,int
v)34
void
init()
45void tarjan(int
u)54
else
if(!id[e.to])
55 low[u] =min(low[u],dfn[e.to]);56}
57if(low[u] ==dfn[u])66}
67return;68
}69void
find_tarjan()
74return;75
}76intmain()
86find_tarjan();
87for(int i = 0;i < sum;++i)
93 ans = 0;94
for(int i = 1;i <= scc_cnt;++i)
102}
103}
104 printf("
%d\n
",ans);
105return0;
106 }
這次解題報告就寫到這裡吧,noip倒計時兩個月,祝大家能考個好成績!
posted @
2016-09-19 21:27
小鋼釘丶coding 閱讀(
...)
編輯收藏
BZOJ 1051, 受歡迎的牛
傳送門 求可以被除自己以外所有點遍歷到的點的個數。首先強連通分量跑一遍,縮點之後統計每個強連通分量 可以視為乙個點 的出度。如果有多個出度大於0,則無解 否則輸出唯一出度為0的強連通分量內點的個數。include const int n 10005,m 50005 int n,m,x,y,i,j,t...
bzoj1051 受歡迎的牛
每一頭牛的願望就是變成一頭最受歡迎的牛。現在有n頭牛,給你m對整數 a,b 表示牛a認為牛b受歡迎。這種關係是具有傳遞性的,如果a認為b受歡迎,b認為c受歡迎,那麼牛a也認為牛c受歡迎。你的任務是求出有多少頭牛被所有的牛認為是受歡迎的。第一行兩個數n,m。接下來m行,每行兩個數a,b,意思是a認為b...
bzoj1051 受歡迎的牛(tarjan)
1051 haoi2006 受歡迎的牛 time limit 10 sec memory limit 162 mb description 每一頭牛的願望就是變成一頭最受歡迎的牛。現在有n頭牛,給你m對整數 a,b 表示牛a認為牛b受歡迎。這 種關係是具有傳遞性的,如果a認為b受歡迎,b認為c受歡迎...