hdu----King's Phone
来源:互联网 发布:正规的网络兼职 编辑:程序博客网 时间:2024/05/04 08:54
题意:给你n个点,有n+1条边,现在要删除一些边(至少一条),最后这些点还是可以都联通。
分析: 要使n个点都联通,至少需要n-1条边,所以至多删除2条边。
枚举这两条边(或者唯一的一条边) 然后用并查集判断所有的点是否相连。
复杂度O(N^3);
#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>using namespace std;int Father[111];int from[111];int to[111];int Find(int x){return Father[x] == x ? x : Father[x] = Find(Father[x]);}void Union(int x, int y){int xx = Find(x);int yy = Find(y);if (xx != yy){Father[xx] = yy;}}bool Judge(int n,int m,int x,int y){for (int i = 1; i <= n; i++) Father[i] = i; //初始化 for (int i = 1; i <= m; i++){if (i == x || i == y) continue; //这条边已经删掉了Union(from[i], to[i]);}//判断所有的点是否相连for (int i = 1; i <= n; i++){int cur = Find(i);if (cur != Find(1)){return false;}}return true;}int main(){int TestCas;scanf("%d", &TestCas);while (TestCas--){int n, m;scanf("%d", &n);m = n + 1;for (int i = 1; i <= m; i++){scanf("%d%d", &from[i], &to[i]);}//删除一条边int ans = 0;for (int i = 1; i <= m; i++){if (Judge(n, m, i, -1) == true)ans++;}for (int i = 1; i <= m; i++){for (int j =i + 1; j <= m; j++){if (Judge(n, m, i, j) == true){ans++;}}}printf("%d\n", ans);}return 0;}
0 0
- hdu----King's Phone
- HDU 5641 King's Phone
- HDU 5641 King's Phone
- HDU 5641:King's Phone【模拟】
- HDU 5641 King's Phone【模拟】
- hdu 5641 King's Phone【暴力枚举】
- HDU 5641King's Phone(模拟)
- hdu 5641 King's Phone 模拟
- hdu 5641 King's Phone(模拟)
- (模拟)HDU-5641 King's Phone
- hdu5641 king's phone
- King's Phone
- King's Phone
- HDU 5641 国王的手机 king's phone
- HDU 5641 King's Phone 手机解锁 (模拟)
- HDOJ 5641-King's Phone【模拟】
- hdoj 5641 King's Phone 【模拟】
- HDOJ 5641 King's Phone (模拟)
- 大数据技术人员工具包之—常见数据挖掘分析处理工具
- POJ 1852 Ants
- 动态规划:从新手到专家
- Android启动过程的相关学习
- FragmentTabHost的使用方法
- hdu----King's Phone
- jQuery中的动画
- Linux上安装memcached
- maven 镜像仓库与资源文件
- 文章标题
- Java 多线程(六)——进程间通信与线程间通信
- 我的Linux书架
- Unix域套接字传递描述符字
- Java与Matlab混合编程