題目鏈結【
//計蒜客2018複賽d題,想簡單了。
題解:題目是中文的,不再贅述。
題解:分為三種情況:1、兩個字串都不能變:這種情況最簡單,直接暴力判斷兩個支付穿是否相同即可。
2、兩個字串都能變:把上下對應位置不同的點連無向邊(因為都可以改變),建立了乙個深林,這裡用並查集實現,順便維護每個聯塊的大小,對於每個聯通塊來說,要把這些點都變成一樣的,最少要變換(size-1)次,即選出乙個點,把其他的點都變成被選中的點。
3、乙個能變,乙個不能變:這種情況最複雜。同第二種情況,這裡需要建圖,建立單向邊,(只能由v變成c),對於每乙個聯通塊,我們判斷該聯通塊是不是dag,如果是,那麼只需要改變(size-1)次就行了。如果不是dag,那麼聯通塊中存在環,那麼最少要變(size)次,只需要把這些點連線成有向環就可以了,保證了兩兩可以互達。
只是思路、具體細節和原因需要自己思考。歡迎斧正。qq2421780543。
#includeusingnamespace
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肯定是不行的,像 連通塊 一樣,正解是並查集。題目中圖中每個點的度數大於零且...