时间限制: 1 Sec 内存限制: 512 MB
题目描述
在一个没有重边和自环的无向图中,如果无向图是连通的,且每个点至多属于一个简单环,那么称这个图是一个点仙人掌。

上方三个都是点仙人掌,而下方两个不是。
在点仙人掌的基础上,如果取消连通的限制,那么称这个图是一个点仙人掌森林。
在一个点仙人掌森林中,如果一条简单路径至多经过一条在环中的边,则称它是R路径。
输入
第一行两个正整数n,m,表示点数和边数。
接下来m行,每行两个正整数,表示一条边的起点和终点。
输出
对于每条边,输出一行答案。
样例输入
7 7
1 2
2 3
3 4
2 5
3 5
5 6
6 7
样例输出
6
4
6
6
6
10
6
提示

题解
先求一遍边双把环都求出来。对于每一个连通图进行树形 d p dp dp。
u p [ i ] [ 0 / 1 ] up[i][0/1] up[i][0/1]表示以第 i i i个点为起点向上(不经过/经过一条边)的方案数。
d o w n [ i ] [ 0 / 1 ] down[i][0/1] down[i][0/1]表示以第 i i i个点为起点向上(不经过/经过一条边)的方案数。
详情可以参考代码。
C o d e : Code: Code:

#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
const int N=2e5+5;
typedef long long ll;
vector<int>vec[N];
int tot=0,p=0,color[N],b[N],head[N*2],deep=0;
int top=0,down[N][2],fa[N],cnt=0,dfn[N],out[N];
int low[N],s[N*2],u[N],v[N],vis[N],up[N][2];
struct edge
{int vet,next;
}edge[N*2];
void add(int u,int v)
{edge[++tot].vet=v;edge[tot].next=head[u];head[u]=tot;
}
void tarjan(int u,int father)
{dfn[u]=low[u]=++deep;s[++top]=u;for(int i=head[u];i;i=edge[i].next){int v=edge[i].vet;if(!dfn[v]){tarjan(v,u);low[u]=min(low[u],low[v]);}else if(v!=father)low[u]=min(low[u],dfn[v]);}if(dfn[u]==low[u]){p++;while(s[top]!=u&&top){color[s[top]]=p;vec[p].push_back(s[top]);top--;}color[s[top]]=p;vec[p].push_back(s[top]);top--;}
}
void dfsdown(int c,int father)
{vis[c]=1;for(int i=0;i<vec[c].size();i++){int u=vec[c][i];down[u][0]=1;for(int i=head[u];i;i=edge[i].next){int v=edge[i].vet;if(color[v]!=color[u]&&color[v]!=father){dfsdown(color[v],c);down[u][0]+=down[v][0];down[u][1]+=down[v][1];}}}for(int i=0;i<vec[c].size();i++){int u=vec[c][i];for(int i=head[u];i;i=edge[i].next){int v=edge[i].vet;if(color[v]==color[u])down[u][1]+=down[v][0];}}
}
void dfsup(int c,int father)
{vis[c]=1;for(int i=0;i<vec[c].size();i++){int u=vec[c][i];for(int i=head[u];i;i=edge[i].next){int v=edge[i].vet;if(color[v]==color[u])up[u][1]+=up[v][0];}}for(int i=0;i<vec[c].size();i++){int u=vec[c][i];for(int i=head[u];i;i=edge[i].next){int v=edge[i].vet;if(color[v]!=color[u]&&color[v]!=father){up[v][0]+=up[u][0]+down[u][0]-down[v][0];up[v][1]+=up[u][1]+down[u][1]-down[v][1];fa[v]=u;dfsup(color[v],c);}}}
}
int main()
{int n,m;scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){scanf("%d%d",&u[i],&v[i]);add(u[i],v[i]);add(v[i],u[i]);}for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i,-1);memset(vis,0,sizeof(vis));for(int i=1;i<=p;i++)if(!vis[i])dfsdown(i,0);memset(vis,0,sizeof(vis));for(int i=1;i<=p;i++)if(!vis[i])dfsup(i,0);for(int i=1;i<=m;i++){int U=u[i],V=v[i];if(color[U]==color[V])printf("%lld\n",(ll)(up[U][0]+down[U][0])*(up[V][0]+down[V][0]));else{if(fa[V]==U)swap(U,V);ll ans=0;for(int j=0;j<2;j++)for(int k=0;k<2;k++)if(j+k<=1)ans+=(ll)up[U][j]*down[U][k];printf("%lld\n",ans);}}return 0;
}

点仙人掌(cactus)相关推荐

  1. 仙人掌[cactus]

    目测图论 结果是区间覆盖 (╯‵□′)╯︵┻━┻ 尊重一下你的名字好吗 因为美妙的仙人掌的性质 我们可以知道对于任意一个点i i和i+1一定直接相连 这样就产生了一条链 根据美妙的仙人掌的性质 接下来 ...

  2. 使用 Python 开发一个恐龙跑跑小游戏,玩起来

    作者 | 周萝卜 来源 | 萝卜大杂烩 相信很多人都玩过 chrome 浏览器上提供的恐龙跑跑游戏,在我们断网或者直接在浏览器输入地址"chrome://dino/"都可以进入游戏 ...

  3. 使用Python开发一个恐龙跳跳小游戏,玩起来

    相信很多人都玩过 chrome 浏览器上提供的恐龙跑跑游戏,在我们断网或者直接在浏览器输入地址"chrome://dino/"都可以进入游戏 今天我们就是用 Python 来制作一 ...

  4. 使用Python开发一个恐龙跑跑小游戏,玩起来

    相信很多人都玩过 chrome 浏览器上提供的恐龙跑跑游戏,在我们断网或者直接在浏览器输入地址"chrome://dino/"都可以进入游戏 今天我们就是用 Python 来制作一 ...

  5. [经典收藏]花语大全

    桔梗花的花语是--真诚不变的爱 白玫瑰的花语是--我足以与你相配 熏衣草的花语是--等待爱情 红色的风信子的花语是--让人感动的爱 时钟花的花语是--爱在你身边 狗尾巴草的花语–暗恋 油桐花的花语是- ...

  6. 我的世界常用命令和物品名称

    显示玩家坐标: /gamerule showcoordinates true 是显示玩家坐标的指令 区域填充: /fill 坐标 坐标 物品 物品大全: https://minecraft.52pk. ...

  7. [BZOJ]1023: [SHOI2008]cactus仙人掌图

    Time Limit: 1 Sec  Memory Limit: 162 MB Description 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这 ...

  8. [SHOI2008]cactus仙人掌图

    Description 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人掌图(cactus).所谓简单回路就是指在图上不重复经过任何一个顶点的 ...

  9. 【刷题】BZOJ 1023 [SHOI2008]cactus仙人掌图

    Description 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人掌图(cactus).所谓简单回路就是指在图上不重复经过任何一个顶点的 ...

最新文章

  1. MySQL面试题 | 附答案解析(二)
  2. 黄仁勋入选《时代》杂志2021最具影响力100人,库克、马斯克也上榜
  3. c语言如何跟进自定义赋值,用最简单的C语言编写自定义函数之数字后移
  4. Pandas初学者代码优化指南
  5. oracle转mysql数据库
  6. 你很烫吗?我很烫——关于栈区和静态存储区的思考
  7. PowerDesigner概念模型详解
  8. Centos7-firewall-cmd
  9. 如何制作Windows镜像
  10. Docker运行tensorflow试试
  11. 图片连续向左向右向下向上滚动和左右运动、指向停止js代码
  12. PreparedStatement是如何防止SQL注入的?
  13. NagiosQL 3的安装
  14. 使用PhoneNumberValidator判断用户输入的电话格式,并用PhoneFormatter对电话号码格式化。...
  15. 互联网企业:如何建设数据安全体系?
  16. 计算机辅助工程分析及应用论文,毕业论文:《浅谈计算机辅助工程(CAE)》.doc...
  17. 规模再创新高!新能源汽车蓝海谁主沉浮
  18. 定理在数学中的简写形式_初中数学常用的定理大全
  19. 二层交换机与三层交换机区别
  20. 别让just do it 误导了你

热门文章

  1. 多文件批量下载打包成.zip
  2. 医学院校教师备课系统的信息安全性研究
  3. 如何30秒做出精美的Word排版?
  4. IOS汉字转拼音首字母
  5. app专项测试之兼容性测试
  6. 如何删除iPhone或iPad上的所有照片
  7. 墙后的全部姿势,全被“瞎眼”AI透视
  8. FTP服务器异地备份文件,ftp异地备份
  9. IGMP基础原理与实验
  10. 蓝桥杯国赛2017瓷砖样式