BestCoder Round #73 (div.2)1002/hdoj5631
2016-03-19 09:27
477 查看
题意:
给出一张 nnn 个点 n+1n+1n+1 条边的无向图,你可以选择一些边(至少一条)删除。
分析:
一张n个点图,至少n-1条边才能保证联通
所以可以知道每次可以删去1条边或者两条边
一开始看了题解,我搞不出来【每次删去1条或者2条】
T^T就是那么弱,妈的
然后判断是否联通,DFS联通图可以,但是好麻烦的
所以想到判断一个集合,用并查集,妥妥的
给出一张 nnn 个点 n+1n+1n+1 条边的无向图,你可以选择一些边(至少一条)删除。
分析:
一张n个点图,至少n-1条边才能保证联通
所以可以知道每次可以删去1条边或者两条边
一开始看了题解,我搞不出来【每次删去1条或者2条】
T^T就是那么弱,妈的
然后判断是否联通,DFS联通图可以,但是好麻烦的
所以想到判断一个集合,用并查集,妥妥的
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <algorithm> #include <queue> #include <math.h> #include <queue> #include <stack> using namespace std; #define INF 0x3f3f3f #define pi acos(-1.0) #define N 100010 #define LL long long #define mm 1000000007 int pre[110]; int n; struct asd{ int a,b; }; asd q[110]; int Find(int x) { int r=x; while(pre[r]!=r) { r=pre[r]; } int i,j; i=x; while(pre[i]!=r) { j=pre[i]; pre[i]=r; i=j; } return r; } int FUCK(int x,int y) { for(int i=1;i<=n;i++) pre[i]=i; for(int i=1;i<=n+1;i++) //遍历的是点--点(边)哟 { if(i==x||i==y) //去边 continue; int aa=Find(q[i].a); int bb=Find(q[i].b); if(aa!=bb) { pre[aa]=bb; } } int ant=0; for(int i=1;i<=n;i++) { if(pre[i]==i) { ant+=1; } } if(ant==1) return 1; return 0; } int main() { int T; scanf("%d",&T); while(T--) { scanf("%d",&n); for(int i=1;i<=n+1;i++) { scanf("%d%d",&q[i].a,&q[i].b); //输进去的是点--点(边) } int ans=0; for(int i=1;i<=n+1;i++) { for(int j=i;j<=n+1;j++) { if(FUCK(i,j)) ans+=1; } } printf("%d\n",ans); } return 0; }
相关文章推荐
- c++第二次上机实验
- javascript设计模式-工厂模式(简单工厂)
- JSP九大内置对象及四个作用域
- 堆排序
- 把一个javabean序列化
- iOS使用GCD或NSTimer定时刷新按钮的文字,按钮文字闪烁的问题
- 119. Pascal's Triangle II
- win10上vs2013 + qt5.6.0 环境搭建
- 补救
- 安卓生命周期的七种状态
- Tomcat配置虚拟路径
- 面试经历---蘑菇街面试
- JSP serverlet区别与联系
- PDE6 Transport with decay
- 六角填数
- 程序员该如何装逼!
- 单项列表
- 使用map添加学生
- 跳到图片放大区域
- smarty学习笔记之常见代码段用法总结