貝殼找房魔法師顧問 並查集 DAG判斷

2022-07-22 15:48:15 字數 1770 閱讀 9398

題目鏈結【

//計蒜客2018複賽d題,想簡單了。

題解:題目是中文的,不再贅述。

題解:分為三種情況:1、兩個字串都不能變:這種情況最簡單,直接暴力判斷兩個支付穿是否相同即可。

2、兩個字串都能變:把上下對應位置不同的點連無向邊(因為都可以改變),建立了乙個深林,這裡用並查集實現,順便維護每個聯塊的大小,對於每個聯通塊來說,要把這些點都變成一樣的,最少要變換(size-1)次,即選出乙個點,把其他的點都變成被選中的點。

3、乙個能變,乙個不能變:這種情況最複雜。同第二種情況,這裡需要建圖,建立單向邊,(只能由v變成c),對於每乙個聯通塊,我們判斷該聯通塊是不是dag,如果是,那麼只需要改變(size-1)次就行了。如果不是dag,那麼聯通塊中存在環,那麼最少要變(size)次,只需要把這些點連線成有向環就可以了,保證了兩兩可以互達。

只是思路、具體細節和原因需要自己思考。歡迎斧正。qq2421780543。

#includeusing

namespace

std;

typedef

long

long

ll;const

int maxn = 1e5 + 15

;ll a[maxn], b[maxn];

char s[15], t[15

];//

-----------------------並查集

intfa[maxn], val[maxn];

void

init()

int find(int

u)void unit(int u, intv)}

//-------------------------edge

int rd[maxn], vis[maxn], cnt = 0

;;vector

vt[maxn];

mapmp;

queue

que;

struct

edge

} e[maxn * 4

];int

head[maxn], tot;

void

init_edge()

void add_edge(int u, int

v)//

--------------------------主函式

intmain ()

else

if(fg1 && fg2)//

都可以更改

int num = 0

;

for(int i = 1; i <= 100000; i++)

printf(

"%d\n

", num);

}else

//只能改乙個

for(int i = 1; i <= 100000; i++)//

提取聯通塊

else}}

int num = 0

;

for(int i = 1; i <= cnt; i++)//

拓撲排序,判斷dag

int tmp = 0

;

while(!que.empty())

}if(tmp ==len)

num += len - 1

;

else

num +=len;

}printf(

"%d\n

", num);

}return0;

}

貝殼找房魔法師顧問 2018 計蒜之道 複賽

v v無向圖 強連通圖 每個子圖,n個點,選擇n 1條,使互相連線 因為目標點x 點y,可以改為點y 點x v c弱連通圖 將有向圖的所有的有向邊替換為無向邊,所得到的圖稱為原圖的基圖。如果乙個有向圖的基圖是連通圖,則有向圖是弱連通圖。1.乙個弱連通子圖,它裡面的點與該弱連通子圖外的點與沒有關係,可...

並查集 黑魔法師之門

黑魔法師之門 magician.pas c cpp 題目描述 的個數對1000000009取模的值。此處子圖 v,e 定義為 點集v和邊集e都是原圖的任意子集,其中e中的邊的端點都在v中。輸入格式 第一行包含兩個整數n和m。接下來m行,每行兩個整數a和b,代表門控系統新增了一條無向邊 a,b 輸出格...

黑魔法師之門 並查集

有一張無向無權圖,求每一時刻圖中每個點的度數大於零且都是偶數的子圖的個數對1000000009取模的值。此處子圖 v,e 定義為 點集v和邊集e都是原圖的任意子集,其中e中的邊的端點都在v中。由於每一時刻都要輸出,所以dfs肯定是不行的,像 連通塊 一樣,正解是並查集。題目中圖中每個點的度數大於零且...