博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ——T2117 Electricity
阅读量:4325 次
发布时间:2019-06-06

本文共 2777 字,大约阅读时间需要 9 分钟。

Time Limit: 5000MS   Memory Limit: 65536K
Total Submissions: 5459   Accepted: 1788

 

 当m==0 时,特判输出 n-1~~~

先求出原始的连通分量,

然后只有删割点才会增加连通分量,枚举每个割点

最后加上原始的

1 #include 
2 #include
3 #include
4 5 using namespace std; 6 7 const int N(100015); 8 int n,m,u,v; 9 int sumedge,head[N<<1]; 10 struct Edge 11 { 12 int to,next; 13 Edge(int to=0,int next=0) : 14 to(to),next(next) {} 15 }edge[N*5]; 16 17 void ins(int from,int to) 18 { 19 edge[++sumedge]=Edge(to,head[from]); 20 head[from]=sumedge; 21 } 22 23 int low[N<<1],dfn[N<<1],tim; 24 int sumcol,num[N]; 25 int cutpoint[N]; 26 27 void DFS(int now,int pre) 28 { 29 low[now]=dfn[now]=++tim; 30 int sumtredge=0,if_cutpoint=0; 31 for(int i=head[now];i!=-1;i=edge[i].next) 32 { 33 int go=edge[i].to; 34 if((i^1)!=pre) 35 { 36 if(!dfn[go]) 37 { 38 sumtredge++; 39 DFS(go,i); 40 if(low[go]>=dfn[now]) 41 { 42 if_cutpoint=1; 43 num[now]++; 44 } 45 46 low[now]=min(low[now],low[go]); 47 } 48 else low[now]=min(low[now],dfn[go]); 49 } 50 } 51 if(pre==-1) 52 { 53 if(sumtredge>1) cutpoint[now]=1; 54 } 55 else if(if_cutpoint) cutpoint[now]=1; 56 } 57 58 int ans,cnt,tmp,vis[N],root[N],cut[N]; 59 60 void link(int x) 61 { 62 vis[x]=1; 63 for(int i=head[x];i!=-1;i=edge[i].next) 64 { 65 v=edge[i].to; 66 if(!vis[v]) link(v); 67 } 68 } 69 70 void cut_point(int pre,int fa) 71 { 72 vis[pre]=1; 73 for(int i=head[pre];i!=-1;i=edge[i].next) 74 { 75 int go=edge[i].to; 76 if(!vis[go]) 77 { 78 if(pre==fa) cnt++; 79 cut_point(go,fa); 80 } 81 } 82 } 83 84 void init(int n) 85 { 86 sumedge=-1; ans=tim=tmp=cnt=0; 87 memset(vis,0,sizeof(vis)); 88 memset(low,0,sizeof(low)); 89 memset(dfn,0,sizeof(dfn)); 90 memset(num,0,sizeof(num)); 91 memset(cut,0,sizeof(cut)); 92 memset(root,0,sizeof(root)); 93 memset(head,-1,sizeof(head)); 94 memset(cutpoint,0,sizeof(cutpoint)); 95 } 96 97 int main() 98 { 99 // freopen("makerout.txt","r",stdin);100 // freopen("myout.txt","w",stdout);101 102 while(~scanf("%d%d",&n,&m)&&n)103 {104 init(n);105 if(m==0) printf("%d\n",n-1);106 else107 {108 for(;m;m--) 109 {110 scanf("%d%d",&u,&v);111 ins(u,v); ins(v,u);112 }113 for(int i=0;i

 

转载于:https://www.cnblogs.com/Shy-key/p/6883121.html

你可能感兴趣的文章
base64编码的图片字节流存入html页面中的显示
查看>>
这个大学时代的博客不在维护了,请移步到我的新博客
查看>>
GUI学习之二十一——QSlider、QScroll、QDial学习总结
查看>>
[Python设计模式] 第25章 联合国维护世界和平——中介者模式
查看>>
nginx反向代理docker registry报”blob upload unknown"解决办法
查看>>
gethostbyname与sockaddr_in的完美组合
查看>>
kibana的query string syntax 笔记
查看>>
基于Lua插件化的Pcap流量监听代理
查看>>
旋转变换(一)旋转矩阵
查看>>
thinkphp3.2.3 bug集锦
查看>>
[BZOJ 4010] 菜肴制作
查看>>
C# 创建 读取 更新 XML文件
查看>>
KD树
查看>>
VsVim - Shortcut Key (快捷键)
查看>>
C++练习 | 模板与泛式编程练习(1)
查看>>
HDU5447 Good Numbers
查看>>
08.CXF发布WebService(Java项目)
查看>>
java-集合框架
查看>>
RTMP
查看>>
求一个数的整数次方
查看>>