LOJ:相框(欧拉回路、分类讨论)
生活随笔
收集整理的這篇文章主要介紹了
LOJ:相框(欧拉回路、分类讨论)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
解析
本題是一道if的板子題
抓住關鍵:使所有點的度數全變為2
首先對于度數大于2的點,把它分為若干2度點(和可能的一個單點)
現在我們只剩下單點和二度點了
接下來分來討論一下
若有多個連通塊,我們要把它們變成鏈再拼起來
所以我們要把所有連通塊的各自的單點拚到只剩下一個
最后把所有鏈拼起來
若只有一個連通塊,把所有的1度點合并即可
對于0的處理:開一個新點
代碼
#include<bits/stdc++.h> using namespace std; #define ll long long const int N=1e5+1050; const double eps=1e-6; inline ll read(){ll x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return f*x; } int n,m; struct node{int to,nxt; }p[N*10]; int fi[N],cnt; inline void addline(int x,int y){p[++cnt]={y,fi[x]};fi[x]=cnt;return; } int du[N]; int ans,num; bool vis[N],f; void dfs(int x){if(vis[x]) return;vis[x]=1;if(du[x]>2) ++ans,f=1;num+=(du[x]&1);for(int i=fi[x];~i;i=p[i].nxt){int to=p[i].to;dfs(to);}return; } int sum,flag,flag2; int main(){#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);#endifmemset(fi,-1,sizeof(fi));cnt=-1;n=read();m=read();for(int i=1;i<=m;i++){int x=read(),y=read();if(!x) x=++n;if(!y) y=++n;du[x]++;du[y]++;addline(x,y);addline(y,x);}for(int i=1;i<=n;i++){if(!vis[i]&&du[i]){num=0;f=0;flag++;dfs(i);if(num>0)ans+=(num)/2-1;else ans+=f?0:1;}}if(flag==1){if(num>0)ans-=(num)/2-1;else ans-=f?0:1;ans=ans+num/2;}if(flag>1) ans+=flag;printf("%d\n",ans);return 0; } /* 4a 1 2 2 3 1 3 3 4 */總結
以上是生活随笔為你收集整理的LOJ:相框(欧拉回路、分类讨论)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 未来可期:苹果 16 英寸 M3 Mac
- 下一篇: iPhone / iPad 版《生化危机