分析:因為每一組編號都是連續的嘛,所以能分成一組的盡量分,每次加邊後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,兩個城市間可能有多條道路,並且可能存在將某一城市與其自身連線起來的道路。後來由於戰爭的原因,國王不得不下令減小花費從而關閉一些道路,但是必須要保證任意兩個城市相互可達。道...