CodeForces
来源:互联网 发布:淘宝midway 编辑:程序博客网 时间:2024/05/17 23:05
点击打开题目链接
题目大意:
给出城市个数n和道路条数m,允许自环。求使得所有的m条路中有m-2条路走两次,剩余2条路走一次,并且遍历所有城市的方案数。(两个方案被认为是不同的,当走一次的路不相同时)
思路:
首先判断是否连通,不连通输出0.
然后考虑所有路都走两次,相当于某种路线方案走两次,一次去,一次回。
问题则转化成了怎样去掉两条边使得剩余路线满足欧拉通路。即最多两个点的度数为奇数。
1.去掉任意两个自环后所有点度数还是偶数,满足条件。
2.去掉一个自环和剩下任意一条边,多出两个奇度点,满足条件。
3.去掉两条非自环的边,且没有公共点,多出4个奇度点,不满足条件。
4.去掉两条非自环的边,有公共点,多出2个奇度点,满足条件。
分类加上满足条件的情况即可。
错了两次,一次是寻找起点进行dfs时判断条件不应该看度数是否非0,应该看该点公共边是否非0(自环)。第二次乘积时应转为long long.
代码:
#include<iostream>#include<vector>using namespace std;const int maxn = 1e6 + 5;int in[maxn];//记录入度int vis[maxn];int n, m;long long cnt;//记录自环数vector<int>_map[maxn];//邻接表存图//dfs遍历判断连通void dfs(int u) { vis[u] = 1; for(int i = 0; i < _map[u].size(); i++) { int v = _map[u][i]; if(!vis[v]) dfs(v); }}int main() { ios::sync_with_stdio(false); cin >> n >> m; for(int i = 0; i < m; i++) { int u, v; cin >> u >> v; if(u == v) { cnt++; } else { _map[u].push_back(v); _map[v].push_back(u); } in[u]++; in[v]++; } for(int i = 1; i <= n; i++) { if(_map[i].size()) { dfs(i); break; } } //判断是否连通 for(int i = 1; i <= n; i++) { if(in[i] && !vis[i]) { cout << 0 << endl; return 0; } } long long ans = 0; ans += cnt * (cnt-1) / 2;//自环和自环 ans += cnt * (m - cnt);//自环和任意非自环边 for(int i = 1; i <= n; i++) { ans += 1LL * _map[i].size() * (_map[i].size() - 1) / 2;//该公共点的两条边 } cout << ans << endl; return 0;}
阅读全文
0 0
- codeforces~~~
- Codeforces
- codeforces
- Codeforces
- codeforces
- codeforces
- Codeforces
- Codeforces
- CodeForces
- CodeForces
- CodeForces
- CodeForces
- CodeForces
- Codeforces
- Codeforces
- Codeforces
- Codeforces
- Codeforces
- 出栈的合法性检测
- 分答项目_知识点:阿里云免费申请https教程
- Sublime3的安装手册
- The fully qualified name of the bean's class, except if it serves only as a parent definition ...
- Tips: JQuery 多元素选择并转化成数组
- CodeForces
- 负载均衡高可用核心概念及常用软件
- sap 寄售业务流程
- spark(2)-入门spark之java maven wordcount实验
- 代码简化之路
- redis分布式锁redisson(下)
- sql 基础
- 1266谁是冠军(重写的)
- 部门人员多选页面---