HZOI2019 星際旅行 尤拉路

2022-04-14 07:27:12 字數 1463 閱讀 4121

題目大意:

—————————>

題解:網上都是一句話題解:將所有的邊拆成兩條,問題變成去掉兩條邊,使得原圖存在一條尤拉路徑。注意新圖中所有點的度數均為偶數,只需按照去掉任意2個自環、去掉任意1個自環和任意一條邊、去掉兩條有公共頂點的邊進行討論即可。注意圖不連通的判斷方式,不是點不連通,而是邊不連通。

這顯然十分晦澀難懂

題目要求m-2條邊經過兩次,2條邊經過1次。

如果不考慮有兩條邊經過一次,那麼把所有邊經過兩次就是走乙個尤拉路,由起點走向終點

那麼2條邊經過一次怎麼理解?就是由終點往回倒2條邊

我們首先判斷圖的連通性,用並查集即可,但要判定單獨的乙個點在圖的外面,沒有任何邊與它連通的情況(你也可以理解成只要所有的邊在乙個集合裡就可以,不一定所有的點在同一集合中)

那麼往回倒的這兩條邊有什麼情況?

題中沒有說不存在自環,那麼倒回去的這兩條邊有三種情況:

1,兩個自環

2,乙個自環和一條非自環邊

3,兩條連在同一點的邊

我們定義du[i]為不考慮自環情況下i的度,tot是自環的個數,

sum=($\sum_\limits^$du[i])/2,(除以2是因為一條邊連線了兩個點,所以會算重)

對於第一種情況,ans1=tot*(tot-1)/2(等價與從tot個自環選出2個不重複的,$c_^$)

第二種情況:ans2=tot*sum(自環中選乙個,非自環邊選乙個)

第三中情況:ans3=$\sum_\limits^$du[i]*(du[i]-1)/2(從與i相連的邊中選出不重複的兩條,$c_^$)。

最終的答案就是三種情況相加。

#include#include#include#include#define maxn 100005

#define ll long long

using namespace std;

ll fa[maxn],n,m,du[maxn],tot_c=0,ans=0,du2[maxn],rt,sum=0;

ll find(ll x)

void unionn(ll x,ll y)

int main()else tot_c++;

du2[v]++,du2[u]++;

} for(ll i=1;i<=n;i++)

} for(ll i=1;i<=n;i++)

} for(ll i= 1;i<=n;i++)

ans+=du[i]*(du[i]-1)/2,sum+=du[i];

sum/=2;

ans+=tot_c*sum;

ans+=tot_c*(tot_c-1)/2;

printf("%lld\n",ans);

return 0;

}

ps:對於需要開long long的題我都是把所有變數全變成long long型別

HZOI2019 砍樹 整除分塊

這題。一開始想的二分,但此題不具備決策單調性,所以是錯的 看了題解之後並不知道它在考什麼 看一眼官方提解 問題等價於求乙個最大的d,滿足 sum limits lceil frac rceil d a i k sum limits lceil frac rceil d c 到這裡思路還是非常清晰的,...

ctsc2010 星際旅行

題意很簡單 給定一棵樹,問從根分別走到每個節點的最長路程,其中每個點給定lim,即最多從該點出發lim次,保證lim大於等於該點的度數。特別 鳴謝 ldl在他的模擬題中出了這道題。當題解講這要用樹形dp解網路流模型時,都被驚異了,完全沒有想到網路流,也完全沒有必要網路流,atm在考場上直接有樹形dp...

BFS HRBUST 2188 星際旅行

星際旅行 time limit 1000 ms memory limit 32768 k total submit 150 66 users total accepted 80 60 users rating special judge no description 小z在星際旅行中,他想從當前起始...