日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

LOJ:相框(欧拉回路、分类讨论)

發布時間:2023/12/3 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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:相框(欧拉回路、分类讨论)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。