time limit: 10 sec
memory limit: 162 mb
submit: 1960
solved: 941 [
submit][
status][
discuss]
一年一度的假面舞會又開始了,棟棟也興致勃勃的參加了今年的舞會。今年的面具都是主辦方特別定製的。每個參加舞會的人都可以在入場時選擇一 個自己喜歡的面具。每個面具都有乙個編號,主辦方會把此編號告訴拿該面具的人。為了使舞會更有神秘感,主辦方把面具分為k (k≥3)類,並使用特殊的技術將每個面具的編號標在了面具上,只有戴第i 類面具的人才能看到戴第i+1 類面具的人的編號,戴第k 類面具的人能看到戴第1 類面具的人的編號。 參加舞會的人並不知道有多少類面具,但是棟棟對此卻特別好奇,他想自己算出有多少類面具,於是他開始在人群中收集資訊。 棟棟收集的資訊都是戴第幾號面具的人看到了第幾號面具的編號。如戴第2號面具的人看到了第5 號面具的編號。棟棟自己也會看到一些編號,他也會根據自己的面具編號把資訊補充進去。由於並不是每個人都能記住自己所看到的全部編號,因此,棟棟收集的信 息不能保證其完整性。現在請你計算,按照棟棟目前得到的資訊,至多和至少有多少類面具。由於主辦方已經宣告了k≥3,所以你必須將這條資訊也考慮進去。
第一行包含兩個整數n, m,用乙個空格分隔,n 表示主辦方總共準備了多少個面具,m 表示棟棟收集了多少條資訊。接下來m 行,每行為兩個用空格分開的整數a, b,表示戴第a 號面具的人看到了第b 號面具的編號。相同的數對a, b 在輸入檔案中可能出現多次。
包含兩個數,第乙個數為最大可能的面具類數,第二個數為最小可能的面具類數。如果無法將所有的面具分為至少3 類,使得這些資訊都滿足,則認為棟棟收集的資訊有錯誤,輸出兩個-1。
題解:分三種情況:
1:無環,所有點的入度都為1,則最大值為所有長度的和,最小值為最長鏈的長度。
2:有環,則最大值為所有環長度的最大公約數,最小值為所有環長度的公約數中大於等於3且最小的數
3:無環,有點的入度不為1,這個就有點難搞了,開始也沒想出來,看了題解才明白。
舉個例子:
a->b->c->d->e,a->e,我們先把a,b,c,d,e依次編為1,2,3,4,5.又因為a->e,所以e與b一樣為第2類,所以d就為第1類了。。
所以最大值為3.
我們可以用dfs來實現這個過程,建兩條邊,一條權值為1,反向邊權值為-1.具體操作見**。
#include#include#include#includeusing namespace std;
const int n=1000000;
int n,m;
struct nodesa[n*2];int len=0,first[n];
int fa[n],yu;
bool tf[n];
void add(int x,int y,int z)
int findfa(int x)
int mymax(int x,int y)
int mymin(int x,int y)
{ if(x
BZOJ 1064 Noi2008 假面舞會
題目大意 n個人,k種假面,每人戴一種,戴第i種的可以看見第i 1種,戴第k種的可以看見第1種,給出m條關係表示乙個人可以看到另乙個人,問k可能的最大值和最小值。n 100,000,m 1,000,000 思路 染色,若點i顏色為ci,就把點i能到的點染成ci 1,能到點i的點染成ci 1,如果染之...
NOI 2008 奧運物流 trans
首先應從題目條件中得到1號點一定在乙個環中,並且有且僅有乙個環。容易證明r 1 的計算公式 其中,d i 表示點i到1號點的距離,len表示環的長度。利用該公式,可以證明如果修改某個點的後繼,一定是把它的後繼改為1號 首先應明確,由於k 1,公式中的的d i len均越小越好。點x不在環上,則修改x...
NOI2008 設計路線 design
題目及題解可以參見byv大牛的,很詳細 自己的一些想法 實現的時候不需要求第一問的解是多少,只需要找到第乙個a i,b 0的b,然後前面的a i,b1 b1都是等於0的。所以這個定義 b的方案數就是 b的方案數。要熟悉這種利用輔助遞推,字首乘積,字尾乘積,以及固定乙個指標,劃另外乙個為1維的題。至於...