題目概述:
題面有點翻譯不來……可以用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 12using
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個圍成圈的水龍頭,開始它們全都是開啟漏水的。接著你要跟電腦博弈,從電腦開始,雙方可以選擇關閉連續的兩個水龍頭 當然,已關的不能再開啟了 也可以只選擇關掉乙個,...