題目大意:
—————————>
題解:網上都是一句話題解:將所有的邊拆成兩條,問題變成去掉兩條邊,使得原圖存在一條尤拉路徑。注意新圖中所有點的度數均為偶數,只需按照去掉任意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在星際旅行中,他想從當前起始...