noip模擬賽 道路分組

2022-05-01 07:51:12 字數 1440 閱讀 5532

分析:因為每一組編號都是連續的嘛,所以能分成一組的盡量分,每次加邊後dfs判斷一下1和n是否連通.有向圖的判連通沒有什麼很快的方法,特別注意,並查集是錯的!這個演算法可以得到60分.

事實上每一次都不需要從點1開始dfs,因為之前很多點都遍歷到了,再從1開始會重複.如果新加的一條邊的起點沒有被訪問過,這條邊暫時是沒用的,不需要再從1開始dfs,直接把這條邊加進去就好了.如果這條邊的起點已經被訪問過了,那麼從這條邊的終點開始dfs就可以了,這樣就節省了大量不必要的搜尋,可以ac.

正解是倍增+二分.還是這樣乙個貪心過程.只是不能一條一條邊往裡面加,太慢了,可以利用倍增的思想.每次加1條邊,2條邊,4條邊......如果加2^i條邊滿足要求,加2^(i+1)條邊不滿足要求,就在2^i和2^(i+1)之間二分,看到底加多少條邊,非常奇妙.感覺就像在樹上跳一樣,每次可以一步一步地跳,也可以先跳一大步,如果不行就跳一小步,如果可以就再跳一小步,這種方法可以加速每次+1的列舉.

60分暴力:

#include #include 

#include

#include

using

namespace

std;

int n, m, vis[200010], t, head[200010],ans, to[500010], nextt[500010], tot = 1

;struct

node

e[500010

];void add(int x, int

y)void dfs(int

u) }

}int

main()

}printf(

"%d\n

", ans + 1

);

return0;

}

正解:

#include #include 

#include

#include

using

namespace

std;

int n, m, vis[200010], t, head[200010], ans, to[500010], nextt[500010], tot = 1, cnt, pre[200010

];struct

node

e[500010

];void add(int x, int

y)void dfs(int

u) }

}int

main()

else

i++;

}else

i++;

}printf(

"%d\n

", ans);

return0;

}

NOIP模擬 保留道路

很久很久以前有乙個國家,這個國家有 n 個城市,城市由 1,2,3,n 標號,城市間有 m 條雙向道路,每條道路都有兩個屬性 g 和 s 兩個城市間可能有多條道路,並且可能存在將某一城市與其自身連線起來的道路。後來由於戰爭的原因,國王不得不下令減小花費從而關閉一些道路,但是必須要保證任意兩個城市相互...

noip模擬賽 分組

分析 暴力分挺多,也挺好想的,個人感覺兩個特殊性質沒什麼卵用.對於k 1,n 1024的情況,從後往前貪心地分,如果能和上一組分在一起就分在一起,否則就再開一組,這樣可以保證字典序最小.ai 2就看前面有沒有2.有就不能分在一組.n 131072就不能再這樣二重迴圈列舉了,因為兩個數的和頂多只有26...

noip模擬賽 保留道路

問題描述 很久很久以前有乙個國家,這個國家有n個城市,城市由1,2,3,n標號,城市間有m條雙向道路,每條道路都有兩個屬性g和s,兩個城市間可能有多條道路,並且可能存在將某一城市與其自身連線起來的道路。後來由於戰爭的原因,國王不得不下令減小花費從而關閉一些道路,但是必須要保證任意兩個城市相互可達。道...