博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ1123 [POI2008]BLO
阅读量:4945 次
发布时间:2019-06-11

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

tarjan求割点,乘法原理统计答案,对数答案翻倍。

By:大奕哥

1 #include
2 using namespace std; 3 const int N=100005; 4 struct node{ 5 int to,nex; 6 }e[1000005]; 7 int head[N],dfn[N],low[N],size[N],idx,cnt,n,m; 8 long long ans[N]; 9 void add(int x,int y)10 {11 e[++cnt].to=y;e[cnt].nex=head[x];head[x]=cnt;12 }13 void dfs(int x,int fa)14 {15 dfn[x]=low[x]=++idx;size[x]=1;int num=0;16 for(int i=head[x];i;i=e[i].nex)17 {18 int y=e[i].to;19 if(y==fa)continue;20 if(!dfn[y])21 {22 dfs(y,x);23 size[x]+=size[y];24 low[x]=min(low[x],low[y]);25 if(low[y]>=dfn[x])26 {27 ans[x]+=1ll*num*size[y];28 num+=size[y];29 }30 }31 else if(size[y])low[x]=min(low[x],dfn[y]);32 }33 ans[x]+=1ll*num*(n-num-1);ans[x]+=n-1;34 }35 int main()36 {37 scanf("%d%d",&n,&m);38 for(int i=1;i<=m;++i)39 {40 int x,y;41 scanf("%d%d",&x,&y);42 add(x,y);add(y,x);43 }44 for(int i=1;i<=n;++i)45 if(!dfn[i])dfs(i,i);46 for(int i=1;i<=n;++i)47 printf("%lld\n",ans[i]*2);48 return 0;49 }

 

转载于:https://www.cnblogs.com/nbwzyzngyl/p/8442995.html

你可能感兴趣的文章
jpa SQL Error: 17006, SQLState: null
查看>>
新的一年来了,先看一看自己的编程能力吧!
查看>>
什么是MVC
查看>>
新建web project不自动生成web.xml解决方案
查看>>
如何快速访问MSDN某一个类或方法的帮助文档
查看>>
SqlServer 删除重复记录
查看>>
win10下sublime text3 使用view in browser的快捷鍵添加方式
查看>>
【Linux】神奇的kill
查看>>
关于radio属性如何添加成为双击取消
查看>>
Servlet的生命周期
查看>>
《Linux 性能及调优指南》1.1 Linux进程管理
查看>>
Spring Security使用心得
查看>>
操作系统简介
查看>>
【IntelliJ 】IntelliJ IDEA 15 创建maven项目
查看>>
mysql中的union用法以及子查询综合应用
查看>>
jQuery使用总结
查看>>
Oracle数据库事物隔离级别
查看>>
多变的形状
查看>>
Navicat For Mysql快捷键
查看>>
Git学习笔记4
查看>>