Bees are one of the most industrious insects. Since they collect nectarand pollen from flowers, they
have to rely on the trees in the forest. For simplicity they numbered the n trees from 0 to n − 1. Instead
of roaming around all over the forest, they use a particular list of paths. A path is based on two trees,
and they can move either way i.e. from one tree to another in straight line. They don’t use paths that
are not in their list.
As technology has been improved a lot, they also changed their working strategy. Instead of hovering
over all the trees in the forest, they are targeting particular trees, mainly trees with lots of flowers.
So, they planned that they will build some new hives in some targeted trees. After that they will only
collect their foods from these trees. They will also remove some paths from their list so that they don’t
have to go to a tree with no hive in it.
Now, they want to build the hives such that if one of the paths in their new list go down (some
birds or animals disturbs them in that path) it’s still possible to go from any hive to another using the
existing paths.
They don’t want to choose less than two trees and as hive-building requires a lot of work, they need
to keep the number of hives as low as possible. Now you are given the trees with the paths they use,
your task is to propose a new bee hive colony for them.
Input
Input starts with an integer T (T ≤ 50), denoting the number of test cases.
Each case starts with a blank line. Next line contains two integers n (2 ≤ n ≤ 500) and m
(0 ≤ m ≤ 20000), where n denotes the number of trees and m denotes the number of paths. Each of
the next m lines contains two integers u v (0 ≤ u, v < n, u ̸= v) meaning that there is a path between
tree u and v. Assume that there can be at most one path between tree u to v, and needless to say that
a path will not be given more than once in the input.
Output
For each case, print the case number and the number of beehives in the proposed colony or ‘impossible’
if its impossible to find such a colony.
NOTE: Dataset is huge. Use faster I/O methods.
Sample Input
3
3
0
1
2
3
1
2
0
2 1
0 1
5
0
1
1
2
0
3
6
1
2
3
3
4
4
Sample Output
Case 1: 3
Case 2: impossible
Case 3: 3

#include <cstdio>
#include <cstring>
#include <cstring>
#include <queue>
#include <algorithm>
#include <vector>
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = ;
const int M = ; vector<int> g[N];
int vis[N], dis[N], pre[N];
queue<int> que; int ans;
void bfs(int st) {
while(!que.empty()) que.pop();
memset(vis, , sizeof vis);
memset(dis, INF, sizeof dis);
memset(pre, -, sizeof pre);
dis[st] = ;
vis[st] = ;
que.push(st); while(!que.empty()) {
int u = que.front(); que.pop();
int sx = g[u].size();
for(int i = ; i < sx; ++i) {
int v = g[u][i];
if(v == pre[u]) continue;
if(!vis[v]) {
vis[v] = ;
dis[v] = dis[u] + ;
que.push(v);
pre[v] = u;
}else {
ans = min(ans, dis[u] + dis[v] + );
}
}
}
}
int main() {
//freopen("in", "r", stdin);
int _, cas = ; scanf("%d", &_);
while(_ --) {
int n, m; scanf("%d%d", &n, &m);
int u, v;
for(int i = ; i <= n; ++i) g[i].clear();
for(int i = ; i < m; ++i) {
scanf("%d%d", &u, &v);
g[u].push_back(v);
g[v].push_back(u);
}
ans = INF;
for(int i = ; i < n; ++i) {
bfs(i);
}
printf("Case %d: ", cas++);
if(ans == INF) puts("impossible");
else printf("%d\n", ans);
}
return ;
}

题意:给出一个无向图,n<=500&&m<=20000, 求一个最小环
思路:枚举起点s,bfs出从s到每个点的距离dis, 对于当前边u,v,如果v被访问过了,且上次v被访问不是通过u,即v != pre[u],那么res = dis[u] + dis[v] + 1

但是注意,枚举的点不一定在环里面,且真正形成的环的长度也是小于等于res的,比如4个点,4条边, 0-1,1-2,1-3,2-3,当从0点bfs时,得到的备选res=5,但环的长度是3,
因为我们是枚举每一个点,最终一定能得到最小环

UVA 12544 - Beehives O(nm) 无向图最小环的更多相关文章

  1. POJ 1734 无向图最小环/有向图最小环

    给定一张图,求图中一个至少包含三个点的环,环上的点不重复,并且环上的边的长度之和最小. 点数不超过100个 输出方案 无向图: /*Huyyt*/ #include<bits/stdc++.h& ...

  2. uva 12544 无向图最小环

    思路:这题的N有500,直接floyd肯定超时. 我的做法是每次枚举一个点,求出包含这个点的最小环. 对所有最小环取最小值.求包含某个点的最小环我用的是启发式搜索,先以该点求一次spfa,然后dfs解 ...

  3. FZU 2090 旅行社的烦恼 floyd 求无向图最小环

    题目链接:旅行社的烦恼 题意是求无向图的最小环,如果有的话,输出个数,并且输出权值. 刚刚补了一发floyd 动态规划原理,用了滑动数组的思想.所以,这个题就是floyd思想的变形.在k从1到n的过程 ...

  4. 【POJ1734】Sightseeing Trip 无向图最小环

    题目大意:给定一个 N 个顶点的无向图,边有边权,如果存在,求出该无向图的最小环,即:边权和最小的环,并输出路径. 题解:由于无向图,且节点数较少,考虑 Floyd 算法,在最外层刚开始遍历到第 K ...

  5. 图论:Floyd-多源最短路、无向图最小环

    在最短路问题中,如果我们面对的是稠密图(十分稠密的那种,比如说全连接图),计算多源最短路的时候,Floyd算法才能充分发挥它的优势,彻彻底底打败SPFA和Dijkstra 在别的最短路问题中都不推荐使 ...

  6. 「LOJ#10072」「一本通 3.2 例 1」Sightseeing Trip(无向图最小环问题)(Floyd

    题目描述 原题来自:CEOI 1999 给定一张无向图,求图中一个至少包含 333 个点的环,环上的节点不重复,并且环上的边的长度之和最小.该问题称为无向图的最小环问题.在本题中,你需要输出最小环的方 ...

  7. POJ 1734 Sightseeing trip(无向图最小环+输出路径)

    题目链接 #include <cstdio> #include <string> #include <cstring> #include <queue> ...

  8. uva 796 Critical Links(无向图求桥)

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  9. USACO4.13Fence Loops(无向图最小环)

    最近脑子有点乱 老是不想清楚就啪啪的敲 敲完之后一看 咦..样例都过不去 仔细一想 这样不对啊 刚开始就写了一SPFA 最后发现边跟点的关系没处理好 删了..写dfs..还是没转化好 开始搜解题方法 ...

随机推荐

  1. WebService如何调试及测试工具

    http://www.cnblogs.com/zfanlong1314/archive/2012/04/06/2434788.html 通常,我们在Visual Studio里调试ASP.NET网站, ...

  2. vim编辑器的使用

    I 在光标所在行的行首插入 A 在光标所在行的行尾插入 { 移动到上一段 } 移动到下一段 空格向后移动一格 H 屏幕顶部 M 屏幕中间 L 屏幕下方 n| 使光标移动到第几个字符处 ngg 移动到制 ...

  3. asp.net mvc 通过T4模板生成框架

    http://www.cnblogs.com/rdst/archive/2012/08/13/2637210.html http://www.kuqin.com/shuoit/20140716/341 ...

  4. 将DataTable生成树json

    protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { ListMenu(); } } protected ...

  5. ecshop 后台时间调用

    <script type="text/javascript" src="../js/calendar.php?lang={$cfg_lang}">& ...

  6. Linux--niaoge

    鸟哥的Linux私房菜 网络基础: 那 TCP/IP 是如何运作的呢?我们就拿妳常常连上的 Yahoo 入口网站来做个说明好了,整个联机的状态可以这样看: 应用程序阶段:妳打开浏览器,在浏览器上面输入 ...

  7. STM8如何使用自带的bootloader

    1,首先确认你使用的STM8有没有自带的bootloader.参考下表 2,STM8空器件可以直接使用自带的bootloader. 3,STM8在使用SWIM烧录后,要想继续使用自带的bootload ...

  8. python基础知识

    由于python的灵活性,赋值前无需强调变量的数据类型,并且变量的数据类型在后期的操作过程中还可以改变,故不介绍关键字,直接定义方法及可以调用的方法. I  基本数据类型 一.字符串 1.使用单引号或 ...

  9. Java 程序的内存泄露问题分析

    什么是内存泄露? 广义的Memory Leak:应用占用了内存,但是不再使用(包括不能使用)该部分内存 狭义的Memory Leak:应用分配了内存,但是不能再获取该部分内存的引用(对于Java,也不 ...

  10. Linux进程间通信(六):共享内存 shmget()、shmat()、shmdt()、shmctl()

    下面将讲解进程间通信的另一种方式,使用共享内存. 一.什么是共享内存 顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存.共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式 ...