CodeForces 557D Vitaly and Cycle(二分图求解)
2015-07-03 19:50
435 查看
题目链接
题意:
给出n个点以及m条边,以及没条边的两个点,求最少添加几条边能得到一个奇环,以及添加边的方法数
解题思路:
添加的边只有四种可能,0,1,2,3
0条边:本身就有奇环 ==> 0 1
2条边:每条边都没有公共点 ==> 2 m*(n-2)
3条边:当且仅当m=0时成立 ==> 3 n*(n-1)*(n-2)/6
比较难搞的就是一条边的时候
用二分图匹配一下
题意:
给出n个点以及m条边,以及没条边的两个点,求最少添加几条边能得到一个奇环,以及添加边的方法数
解题思路:
添加的边只有四种可能,0,1,2,3
0条边:本身就有奇环 ==> 0 1
2条边:每条边都没有公共点 ==> 2 m*(n-2)
3条边:当且仅当m=0时成立 ==> 3 n*(n-1)*(n-2)/6
比较难搞的就是一条边的时候
用二分图匹配一下
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <vector> #include <queue> #include <algorithm> using namespace std; #define ll __int64 #define N 100005 vector<int>vec ; int n,m,flag,top; int p ,si ,num ; ll ma(int t) { memset(num,0,sizeof(num)); for(int i=1;i<=n;i++) { if(p[i]==t) num[si[i]]++; } ll ans=0; for(int i=1;i<=top;i++) { ans+=(ll)num[i]*(num[i]-1)/2; } return ans; } void pa(int u) { top++; si[u] = top; queue<int>q; q.push(u); while(!q.empty()) { u = q.front(); q.pop(); for(int i=0;i<vec[u].size();i++) { int v = vec[u][i]; if(si[v]==0) { si[v] = top; q.push(v); } } } } void bfs(int u) { queue<int>q; p[u] = 1; q.push(u); while(!q.empty()) { u = q.front(); q.pop(); for(int i=0;i<vec[u].size();i++) { int v = vec[u][i]; if(p[v]==0) { p[v] = 3-p[u]; q.push(v); } else { if(p[v]==p[u]) flag=1; } } } } int main() { int x,y; scanf("%d%d",&n,&m); memset(p,0,sizeof(p)); if(m==0) printf("3 %I64d\n",(ll)n*(n-1)*(n-2)/6); else { for(int i=1;i<=m;i++) { scanf("%d%d",&x,&y); vec[x].push_back(y); vec[y].push_back(x); } flag=0; for(int i=1;i<=n;i++) { if(p[i]==0) bfs(i); } if(flag==1) printf("0 1\n"); else { top=0,flag=0; memset(si,0,sizeof(si)); for(int i=1;i<=n;i++) { if(si[i]==0) pa(i); } for(int i=1;i<=n;i++) { if(vec[i].size()>=2) flag=1; } if(flag==0) printf("2 %I64d\n",(ll)m*(n-2)); else { printf("1 %I64d\n",(ll)ma(1)+ma(2)); } } } return 0; }
相关文章推荐
- 用 perl 统计 fasta 文件序列的总长
- 我所了解的meta
- stl之set集合容器应用基础
- spring mvc的注入属性原理,怎样才能知道哪个属性注入到哪里
- 递归与尾递归总结
- ThinkPHP 4.使用Session
- 如何看java.util这个包???
- Thanks
- nginx虚拟目录(alias与root的区别)
- jquery 回车事件
- Matlab插值计算各时刻磁法勘探日变观测值
- 获取网络图片
- Android第四十一期 - 关于微信聊天的功能
- Android第四十一期 - 关于微信聊天的功能
- LeetCode-Fraction to Recurring Decimal-解题报告
- iOS 优化UITableViewCell高度计算的那些事
- 著名的互联网企业的面试笔试真题
- MFC对ini文件的操作
- 整数溢出
- 【技术网站】精品技术网站收藏