HDOJ3639解題報告 縮點 dfs

2022-03-01 10:48:57 字數 2229 閱讀 1896

題目概述:

題面有點翻譯不來……可以用chrome自帶的那個翻譯。

大致思路:

如果跑bfs或者dfs遇到環的話就會出問題,所以先跑一遍tarjan求強連通分量,把環的情況去掉,在剩下的圖上做。

這個時候發現樣例1裡2這個節點指向的兩個節點都是答案,所以反向建圖,用dfs求出所有入度為0的點的子樹大小,最大數即為答案。

輸出節點的時候直接對0~n-1迴圈找即可。

**:

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12

using

namespace

std;

1314

#define sacnf scanf

15#define scnaf scanf

16#define maxn 5010

17#define maxm 26

18#define inf 1061109567

19#define eps 0.00001

20const

double pi=acos(-1.0

);21

#define mod 7

22#define maxnum 10000

23void swap(int &a,int &b)

24int abs(int x)

25 typedef long

long

ll;26 typedef unsigned int

uint;27

28 vectorg[maxn];

29 vectorrg[maxn];

30 stacks;

3132

struct

node

3339

};40

41int

pre[maxn],low[maxn],scc[maxn],scc_val[maxn];

42int

scc_cnt,dfs_clock;

43int

n,m;

44int ans[maxn],in

[maxn],cnt[maxn],vis[maxn];

4546

void dfs(int

u)47

58else

if(!scc[v]) low[u]=min(low[u],pre[v]);59}

60if(pre[u]==low[u])

6169 scc_val[scc_cnt]=cnt;70}

71}7273

void

find_scc()

7483}84

85int count(int

u)86

94return

sum;95}

9697

intmain()

98110

for(int i=1;i<=m;i++)

111115

find_scc();

116117

///縮點

118for(int i=1;i<=scc_cnt;i++)

119123

for(int i=1;i<=n;i++)

124135

}136

}137

138int ans=-1;bool flag=false

;139

for(int i=1;i<=scc_cnt;i++)

140146

}147 printf("

case %d: %d\n

",kase,ans-1

);148

for(int i=1;i<=n;i++)

149155

}156 printf("\n"

);157

}158

//clock_t ed=clock();

159//

printf("\n\ntime used : %.5lf ms.\n",(double)(ed-st)/clocks_per_sec);

160return0;

161 }

hdoj 1153 解題報告

題目意思 有乙個城鎮,它的所有街道都是單行的,並且每條街道都是和兩個路口相連。同時已知街道不會形成迴路。你的任務是編寫程式求最小數量的傘兵,這些傘兵可以訪問 visit 所有的路口。對於傘兵的起始降落點不做限制。解題思路 這個題轉化成求dag圖的最小路徑覆蓋數 節點數 最大匹配數。其中求最大匹配是關...

HDOJ 1047解題報告

練習acm後的第一篇解題報告。這題是求大數階乘的,題目要求最大能求10000的階乘。剛一看到這題,感覺思路很簡單,思考了一會之後就開始寫 思路很簡單,由於是大數乘法,普通的int型別肯定不夠用,要用陣列儲存。然後運算過程就是最簡單的乘法運算過程,乘 移位 加 的簡單過程。提交之後一直是tle,悲劇,...

HDOJ 3951 Coin Game 解題報告

2011年8月18日,阿里巴巴程式設計公開賽a題。本題類似我曾今玩過的的乙個nds解密遊戲 雷頓教授與魔神之笛 裡的一道謎題。遊戲裡是給你15個圍成圈的水龍頭,開始它們全都是開啟漏水的。接著你要跟電腦博弈,從電腦開始,雙方可以選擇關閉連續的兩個水龍頭 當然,已關的不能再開啟了 也可以只選擇關掉乙個,...