題目鏈結 :
題意,初始每乙個城市都有一夥盜賊,沒過乙個時刻盜賊就會逃竄到另乙個城市,你可以在m個城市設定監察站,會逮捕所有經過該城市的盜賊
分析:仔細分細題目,因為每個城市的盜賊都是流動的,這就可能會形成環,而如果成環的話,在環所在任一城市都可以把這批城市的全部盜賊逮捕,就不需要再環上設多個監察站了,進一步推廣,因為可以自己往自己的城市跑,所以也有可能是鏈,而鏈也是滿足設乙個監察站可以逮捕所有
自然想到引入並查集,用map來儲存
1 #include 2using
namespace
std;
3 typedef long
long
ll;4
const
int maxn=1e5+7;5
const
int mod=1e9+7;6
ll a[maxn],v[maxn];
7ll par[maxn];
8ll rnk[maxn];
9ll c[maxn];
10bool cmp(const ll &a,const ll &b)
13void
init()
16ll find(ll x)
20else23}
24void
unite(ll x,ll y)else33}
34bool
same(ll x,ll y)
37int
main()
43for(int i=1;i<=n;i++)
47 mapans;
48 map::iterator ite;
49for(ll i=1;i<=n;i++)
52//
for(int i=1;i<=n;i++) cout<53
int j=0;54
for(ite=ans.begin();ite!=ans.end();++ite)
57 sort(c,c+ans.size(),cmp);
58 ll cnt=0;59
for(ll i=0;i)//
cout<61 cout62return0;
63 }
牛客練習賽41 C 抓捕盜竊犯(並查集)
題解 這個題中逃犯是可以連續移動的,而不是移動到乙個位置後停止,所以用並查集find函式將每個點的最開始的那個點作為父親,然後求屬於此節點的總和,最後排序找出前m大。include include include include using namespace std int n,m,x int p...
牛客練習賽41
相當於求n個點,已知n條邊,組成各個連通分塊,每個連通分塊有乙個和值,求出最大的幾個和值。用並查集給邊建立聯絡,計算連通塊和是 先找到那個fa點 再給該點加值。include include include include include includeusing namespace std typ...
牛客練習賽 41
a.博弈 我們發現 要麼一次拿光,要麼 m 為 1 否則都贏不了 b.dp 思路,因為有負數,如果全負數,最小為 666 300 近似於 21w 所以把錨點設為 210000,dp i j 代表 前 i 個數字 湊夠數字 j 的方案數,dp i j dp i 1 j dp i 1 j a i 但是 ...