[福建集训2011][LOJ10111]相框
這題主要還是分類討論歐拉回路
首先對(duì)于導(dǎo)線一端沒(méi)有東西的新建一個(gè)節(jié)點(diǎn) 由于原圖不一定連通所以需要用到并查集判斷有多少個(gè)連通塊 將一條導(dǎo)線連接的兩個(gè)焊點(diǎn)連接
然后先對(duì)于只有一個(gè)連通塊考慮
1.如果一個(gè)焊點(diǎn)是孤立點(diǎn) 它對(duì)于導(dǎo)線無(wú)影響跳過(guò)
2.如果一個(gè)焊點(diǎn)度數(shù)大于2 它必須被燒熔
3.對(duì)于每?jī)蓪?duì)奇點(diǎn) 它們必須相連 這樣才滿足歐拉回路
對(duì)于一個(gè)連通塊處理后考慮多個(gè)連通塊,必須把他們組合在一起
1.同樣忽略孤立點(diǎn)
2.如果原圖是一個(gè)環(huán)
需要找到一個(gè)點(diǎn)將其燒熔,才能繼續(xù)組合
但其中若有焊點(diǎn)度數(shù)大于2,那么它本身已經(jīng)被燒熔了所以可以略去此步
最后每個(gè)連通塊向外和另一連通塊連接一根導(dǎo)線就組裝好了
3.原圖有鏈 這種情況下只要將一對(duì)奇點(diǎn)向外連就好了 當(dāng)然對(duì)于程序來(lái)說(shuō)就是無(wú)需考慮有鏈的連通塊連接的答案,以為這之前單個(gè)處理已經(jīng)統(tǒng)計(jì)過(guò)了
#include<bits/stdc++.h> using namespace std; const int maxn=101005; int tot,ans,n,m,a,b,cnt; int d[maxn],flag1[maxn],flag2[maxn],fa[maxn]; int read() {int ch=0,x=0;while(ch=getchar(),ch<'0'||ch>'9');while(x=x*10+ch-48,ch=getchar(),ch>='0'&&ch<='9');return x; } int getfa(int x){return fa[x]==x?x:fa[x]=getfa(fa[x]);} void conn(int x,int y) {int fxx=getfa(x),fyy=getfa(y);if(fxx!=fyy)fa[fxx]=fyy; } int main() {n=read();m=read();for(int i=1;i<=n;i++)fa[i]=i;for(int i=1;i<=m;i++){a=read();b=read();if(!a) a=++n,fa[a]=a;if(!b) b=++n,fa[b]=b;conn(a,b);d[a]++;d[b]++;}for(int i=1;i<=n;i++){if(!d[i])continue;if(d[i]&1){cnt++;flag1[getfa(i)]=1;}if(d[i]>2){ans++;flag2[getfa(i)]=1;}}for(int i=1;i<=n;i++)if(getfa(i)==i&&d[i])tot++;if(tot>1){for(int i=1;i<=n;i++)if(getfa(i)==i&&d[i]&&!flag1[i]){ans++;if(!flag2[i])ans++;}}ans+=cnt/2;printf("%d",ans);return 0; }轉(zhuǎn)載于:https://www.cnblogs.com/DavidJing/p/10386798.html
總結(jié)
以上是生活随笔為你收集整理的[福建集训2011][LOJ10111]相框的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【BZOJ4300】—绝世好题(二进制d
- 下一篇: Maven使用详解