NOIP2017赛前模拟 Graph (2017.10.24)
来源:互联网 发布:公安大数据平台有哪些 编辑:程序博客网 时间:2024/06/05 07:02
题意:
给定一个无向图,求最少加多少条边,使得整个图任意两点之间都存在两条及以上的路径。
题解:
作为考试的第一题,据凯爷说,是一道板子题,好像也确实是这样。
首先可以发现,一个边双连通分量中题意肯定成立,所以我们先把一个边双缩成一个点;
然后整张图变成了一棵树,这时候,只要花几个图,就可发现答案为:ans=(度数为1的点的数量+1)/2 ; 如果是在树上找叶子节点,还要判断一下根节点的度数是否为1
#include<cstdio>#include<algorithm>#include<cmath>#include<ctime>#include<cstring>#include<iomanip>#include<iostream>#include<cctype>#include<string>using namespace std;const int N = 100005;const int M = 200005;int n,m,x,y,num,ans,pointnum,top,tra_sort,tot=1;int head[N],first[N],son[N],to[M*2],nxt[M*2];int low[N],dfn[N],stack[N],belong[N];bool vis[N],instack[N];struct node{ int to,nxt; bool vis;}edge[M*2];inline int Readint(){ int i=0,f=1;char c; for(c=getchar();!isdigit(c) && c!='-';c=getchar()); if(c=='-') f=-1,c=getchar(); for(;isdigit(c);c=getchar()) i=(i<<1)+(i<<3)+c-'0'; return i*f;}inline void add(int x,int y){ edge[++tot].to=y; edge[tot].nxt=first[x]; first[x]=tot;}inline void create(int x,int y){ nxt[++tot]=head[x]; head[x]=tot; to[tot]=y;}inline void tra(int x){ low[x]=dfn[x]=++tra_sort; stack[++top]=x,instack[x]=true; for(int i=first[x];i;i=edge[i].nxt){ if(!edge[i].vis){ edge[i].vis=true; edge[i^1].vis=true; int v=edge[i].to; if(!dfn[v]){ tra(v); low[x]=min(low[x],low[v]); } else if(instack[v]) low[x]=min(low[x],dfn[v]); } } if(low[x]==dfn[x]){ pointnum++; int j=-1; while(j!=x){ j=stack[top--]; belong[j]=pointnum; } }}inline void DFS(int x){ vis[x]=true; bool bz=false; for(int i=head[x];i;i=nxt[i]){ if(!vis[to[i]]){ vis[to[i]]=true; son[x]++; DFS(to[i]); bz=true; } } if(bz==false) num++;}int main(){// freopen("graph.in","r",stdin);// freopen("graph.out","w",stdout); n=Readint(),m=Readint(); for(int i=1;i<=m;i++){ x=Readint(),y=Readint(); add(x,y); add(y,x); } for(int i=1;i<=n;i++) if(!dfn[i]) tra(i); tot=0; for(int i=1;i<=n;i++){ for(int e=first[i];e;e=edge[e].nxt){ if(belong[i]!=belong[edge[e].to]){ create(belong[i],belong[edge[e].to]); } } } DFS(1); if(pointnum==1) cout<<"0"; else{ if(son[1]%2==0){ ans=(num/2)+((num%2)==0 ? 0 : 1); } else{ num++; ans=(num/2)+((num%2)==0 ? 0 : 1); } cout<<ans; } return 0;}
阅读全文
0 0
- NOIP2017赛前模拟 Graph (2017.10.24)
- NOIP2017赛前模拟(2017.10.19)
- NOIP2017赛前模拟(2017.10.20)
- NOIP2017赛前模拟(2017.10.23)
- NOIP2017 赛前模拟(2017.10.6)
- NOIP2017赛前模拟 (2017.10.17)考试总结
- NOIP2017 赛前模拟(2017.10.30)考试总结
- NOIP2017赛前模拟 Game DP (2017.10.30)
- NOIP2017赛前模拟(2017.10.31)考试总结
- NOIP2017 赛前模拟 7.24
- NOIP2017赛前模拟 分玩具
- NOIP2017赛前模拟(2017.10.20)Matrix (类似轮廓线DP)
- NOIP2017赛前模拟 STAR (合理证明复杂度)
- NOIP2017赛前模拟 纸袋(并查集)
- NOIP2017赛前模拟 字符串(AC自动机)
- NOIP2017赛前模拟 Table(双向链表)
- 【NOIP2017提高A组模拟10.10】Graph
- NOIP2017 赛前集训
- Openstack和Opendaylight框架集合
- KEIL代码配色方案
- 前端专业技能
- 设置百分数相对性问题
- 《数学之旅》及《什么是数学》
- NOIP2017赛前模拟 Graph (2017.10.24)
- IOS info.plist文件里面添加描述
- Akka(31): Http:High-Level-Api,Route rejection handling
- U-boot的环境变量值得注意的有两个:bootcmd 和bootargs
- 不要等到双十一,几何画板带回家!
- 用caffe训练并测试自己收集的数据,踩了一堆坑
- Akka(31): Http:High-Level-Api,Route rejection handling
- php实现多进程、多线程
- webview引起的libwebviewchromium.so' is 32-bit instead of 64-bit的bug