[pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=61845295

题目大意

给定n个点m条边的无向图,不同点之间只有一条边,但可以有自环,求本质不同的合法路径的总数

一条合法路径是指经过m-2条边恰好2次,2条边1次

两条路径不同指存在一条边在两种路径中经过的次数不同

input

第一行两个整数n,m

接下来m行每行两个整数u,v,表示u到v有一条边

output

一个整数表示答案

hint

1<=n,m<=10^5,1<=u,v<=n

第一眼看到这个题的时候,就有一点思路了。m-2条边经过两次,一条边经过两次,实质上就是一去一反。

为什么会想到这个呢?想想小学的时候学一笔画问题,对于不能一笔画的图我们怎么强行的“一笔画”。就是把笔画过去,又画回来,这样一条边就经过了两次。嘛,这也算是一笔画问题的“性质”吧。

回到问题来,我们希望去掉一团画了两次的路径,剩下的两条可以一笔画。两条边要能够一笔画,就必须要相邻。其相邻的两个点所连接的其他边结合“一去一反”的性质,可以证明在经过了2次后一定能回到出发点。

然后就很容易啦。枚举每个点,从其连接的边中选择两条作为经过1次的边,就有cnt[i]*(cnt[i]-1)/2种选法,求和即可

but。。。

我只得了30分?! 立了一个flag,打脸打的啪啪响。为什么呢?

1、注意题目:可能有自环

自环就像是一个中转站,在经过这个点的时候,想沿着这个环走几次就走几次,显然一次也是可以的。那么,一条自环的边可以和任意一条边组合,就变成了去掉这个自环后,选一条边走一次,其他边走两次的问题了,在经过自环的点时顺便跑一下环,明显任何一条边都可以。

所以还要统计自环对答案的贡献。

2、图可能不连通

但是要注意,如果只有单个的点孤立出来,这样的图仍然是可以的。我们所谓的联通是指边在一个联通图中。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std; const int N=100000+5; ll deg[N],cir[N],cntc=0,edge[N][2],fa[N];
int n,m;
ll tot=0,hasc=0;
ll head[N],end[2*N],nxt[2*N],hh=0;
bool has[N]; int getfa(int x){
if(fa[x]==x) return x;
return fa[x]=getfa(fa[x]);
}
int main(){
scanf("%d%d",&n,&m);
int u,v;
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=m;i++){
scanf("%d%d",&u,&v);
deg[u]++,deg[v]++;
edge[i][0]=u,edge[i][1]=v;
int fau=getfa(u),fav=getfa(v);
if(fau!=fav) fa[fau]=fav;
if(u==v) cir[++cntc]=u,deg[u]--;
}
for(int i=1;i<=m;i++){
u=edge[i][0];
int j;
for(j=1;j<=m&&j==i;j++);
v=edge[j][0];
if(getfa(u)!=getfa(v)){
printf("0");
return 0;
}
v=edge[j][1];
if(getfa(u)!=getfa(v)){
printf("0");
return 0;
}
}
for(int i=1;i<=n;i++)
tot+=deg[i]*(deg[i]-1)/2;
for(int i=1;i<=cntc;i++){
tot+=(m-deg[cir[i]]);
if(has[cir[i]]==0){
hasc++;
has[cir[i]]=1;
}
}
tot-=(hasc-1)*hasc/2;
printf("%lld",tot);
return 0;
}

总结:

1、从题目出发思考问题,不要想着去套算法。生活经验或是以前学过的知识可能是可以触类旁通的。

2、思考问题要思考全面。题目中提示了一些特殊点,要去思考其可能的情况。

【CodeForces 788B】奇妙的一笔画问题的更多相关文章

  1. 【题解】Weird journey Codeforces 788B 欧拉路

    传送门:http://codeforces.com/contest/788/problem/B 好题!好题! 首先图不连通的时候肯定答案是0,我们下面讨论图联通的情况 首先考虑,如果我们每条边都经过两 ...

  2. CodeForces - 788B Weird journey 欧拉路

    题意:给定n个点,m条边,问能否找到多少条符合条件的路径.需要满足的条件:1.经过m-2条边两次,剩下两条边1次  2.任何两条路的终点和起点不能相同. 欧拉路的条件:存在两个或者0个奇度顶点. 思路 ...

  3. Weird journey CodeForces - 788B (路径计数)

    大意:$n$结点$m$条边无向图, 满足 $(1)$经过$m-2$条边$2$次 $(2)$经过其余$2$条边$1$次 的路径为好路径, 求所有好路径数 相当于边加倍后再删除两条边, 求欧拉路条数 首先 ...

  4. CodeForces 788B - Weird journey [ 分类讨论 ] [ 欧拉通路 ]

    题意: 给出无向图. good way : 仅有两条边只经过一次,余下边全经过两次的路 问你共有多少条不同的good way. 两条good way不同仅当它们所经过的边的集合中至少有一条不同 (很关 ...

  5. Codeforces Round #513 总结

    首次正式的$Codeforces$比赛啊,虽然滚粗了,然而终于有$rating$了…… #A  Phone Numbers 签到题,然而我第一次写挂了(因为把11看成8了……) 只需要判断一下有多少个 ...

  6. Codeforces Beta Round #49 (Div. 2)

    Codeforces Beta Round #49 (Div. 2) http://codeforces.com/contest/53 A #include<bits/stdc++.h> ...

  7. 788B(dfs+xjb)

    题目链接: http://codeforces.com/problemset/problem/788/B 题意: 给出一个有 n 个顶点和 m 条边的图(没有重边,可能有自环), 可以从中任意一个顶点 ...

  8. BFS Codeforces Round #297 (Div. 2) D. Arthur and Walls

    题目传送门 /* 题意:问最少替换'*'为'.',使得'.'连通的都是矩形 BFS:搜索想法很奇妙,先把'.'的入队,然后对于每个'.'八个方向寻找 在2*2的方格里,若只有一个是'*',那么它一定要 ...

  9. 【codeforces 789D】Weird journey

    [题目链接]:http://codeforces.com/problemset/problem/789/D [题意] 给你n个点,m条边; 可能会有自环 问你有没有经过某两条边各一次,然后剩余m-2条 ...

随机推荐

  1. eclipse 运行错误:在类XXX中找不到 main 方法, 请将 main 方法定义为: public static void main(String[] args) 否则 JavaFX 应用程序类必须扩展javafx.application.Application

    新建了一个类Hello: 代码: 第一次运行报错: 点击关闭该类的界面时出现: 点击是,然后再次打开,可以正确执行,结果为: 这是为什么....,后来发现了原因:是每次运行或调试前没有自动保存编辑的内 ...

  2. EXTJS4.0 显示图片 动态图片

    在网上找了好久没有好的解决方法 都是用 'box' 什么的组件 改写的 autoEl 好麻烦,修改 好的属性都不能用.弄了好久没弄成 最后: 用panel  显示 html 文本 追加 ‘'<i ...

  3. 【bzoj2097】[Usaco2010 Dec]Exercise 奶牛健美操 二分+贪心

    题目描述 Farmer John为了保持奶牛们的健康,让可怜的奶牛们不停在牧场之间 的小路上奔跑.这些奶牛的路径集合可以被表示成一个点集和一些连接 两个顶点的双向路,使得每对点之间恰好有一条简单路径. ...

  4. 如何从List中删除元素

    从List中删除元素,不能通过索引的方式遍历后删除,只能使用迭代器. 错误的实现 错误的实现方法 public class Demo {     public static void main(Str ...

  5. [洛谷P4588][TJOI2018]数学计算

    题目大意:有一个数$x$和取模的数$mod$,初始为$1$,有两个操作: $m:x=x\times m$并输出$x\% mod$ $pos:x=x/第pos次操作乘的数$(保证合法),并输出$x\%m ...

  6. HDU - 5919 Sequence II

    题意: 给定长度为n的序列和q次询问.每次询问给出一个区间(L,R),求出区间内每个数第一次出现位置的中位数,强制在线. 题解: 用主席树从右向左的插入点.对于当前点i,如果a[i]出现过,则把原位置 ...

  7. BZOJ2157 旅游 【树剖 或 LCT】

    题目 Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,T 城的任意两个景点之间有且只有一条路径. ...

  8. 【CZY选讲·一道图论好题】

    题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图,不仅有边权还有点权.LYK给出了一个子图的定义,一张图G'={V',E'}被称作G的子图,当且仅当: · ...

  9. 刷题总结——Throw nails(hdu4393)

    题目: Problem Description The annual school bicycle contest started. ZL is a student in this school. H ...

  10. 忽略node_modules目录

    如上图所示添加node_modules目录到忽略文件列表里面,点击应用就可以了.