/* THE PROGRAM IS MADE BY PYY */
/*----------------------------------------------------------------------------//
Copyright (c) 2011 panyanyany All rights reserved.
URL : http://acm.hdu.edu.cn/showproblem.php?pid=2433
Name : 2433 Travel
Date : Wednesday, January 25, 2012
Time Stage : 4 hours
Result:
5292805 2012-01-25 14:24:31 Accepted 2433
656MS 324K 2494 B
C++ pyy
Test Data :
Review :
不说了,直接上大牛的解题报告:
http://isomer.me/2011/08/hdu-2433-%E6%9C%80%E7%9F%AD%E8%B7%AF%E9%A2%84%E5%A4%84%E7%90%86/
http://hi.baidu.com/novosbirsk/blog/item/5c26bffbd04d4d6c034f56b7.html
//----------------------------------------------------------------------------*/
#include <cstdio>
#include <CSTRING>
#include <queue>
#include <algorithm>
#include <vector>
using namespace std ;
#define MEM(a, v) memset (a, v, sizeof (a)) // a for address, v for value
#define max(x, y) ((x) > (y) ? (x) : (y))
#define min(x, y) ((x) < (y) ? (x) : (y))
#define INF (0x3f3f3f3f)
#define MAXN 102
struct EDGE {
int u, v ;
} ;
bool used[MAXN], bCnet, bInit ;
int n, m ;
int dist[MAXN], map[MAXN][MAXN], sum_d[MAXN], pre[MAXN][MAXN] ;
EDGE e[30*MAXN] ;
int bfs (int beg)
{
int i, t ;
queue<int> q ;
MEM (used, 0) ;
MEM (dist, 0) ;
used[beg] = 1 ;
// dist[beg] = 0 ;
q.push (beg) ;
while (!q.empty ())
{
t = q.front() ;
q.pop () ;
for (i = 1 ; i <= n ; ++i)
{
if (!used[i] && map[t][i])
{
used[i] = 1 ;
dist[i] = dist[t] + 1 ;
// 只有要第一次 bfs 计算各边的时候才用到
if (bInit)
pre[beg][i] = t ;
q.push (i) ;
}
}
}
int tmpSum = 0 ;
// 从 beg+1 开始 和从 1 开始,效果差不多
for (i = beg + 1 ; i <= n ; ++i)
{
if (!dist[i])
return INF ;
tmpSum += dist[i] ;
}
return tmpSum ;
}
int main ()
{
int i, j ;
int u, v, sum, res ;
while (scanf ("%d%d", &n, &m) != EOF)
{
MEM (map, 0) ;
MEM (pre, 0) ;
for (i = 1 ; i <= m ; ++i)
{
scanf ("%d%d", &u, &v) ;
e[i].u = u ;
e[i].v = v ;
map[u][v] = ++map[v][u] ;
}
sum = 0 ;
bCnet = true ;
bInit = true ;
for (i = 1 ; i <= n ; ++i)
{
sum_d[i] = bfs (i) ;
sum += sum_d[i] ;
// 优化……很显然效果不大
if (sum >= INF)
{
bCnet = false ;
break ;
}
}
bInit = false ;
for (i = 1 ; i <= m ; ++i)
{
u = e[i].u ;
v = e[i].v ;
// map[u][v] 判断有无重边,可以优化300多MS
if (bCnet && map[u][v] == 1)
{
res = 0 ;
for (j = 1 ; j <= n ; ++j)
{
// 最重要的剪枝,否则直接超时
if (pre[j][u] != v && pre[j][v] !=u)
res += sum_d[j] ;
else
{
--map[u][v] ;
--map[v][u] ;
res += bfs (j) ;
++map[u][v] ;
++map[v][u] ;
if (res >= INF)
break ;
}
}
}
else // 一开始漏了这句,一直无限WA,气死了,思维漏洞啊!
res = sum ;
if (res >= INF)
puts ("INF") ;
else
printf ("%d\n", res * 2) ;
}
}
return 0 ;
}
分享到:
相关推荐
ACM_DFS+BFS
### 动态内存+BFS知识点解析 #### 一、程序概览 本程序主要通过结合动态内存分配与广度优先搜索(BFS)算法来解决一个图论问题:即在一个无向图中寻找从起点到其他各顶点的路径顺序。程序首先读入测试用例的数量,...
DFS+BFS深度+广度优先遍历.cpp
在这个项目中,"标准C的图的实现+BFS和DFS遍历+Dijkstra算法+Prim算法+Kruskal算法实现"涵盖了图的多种核心操作和算法。接下来,我们将详细讨论这些知识点。 首先,我们来看图的实现。在标准C语言中,图可以使用...
图的相关算法比较全面的总结,包括了图的深度和广度遍历算法,prim和kruskal两种最小生成树的算法,邻接矩阵和邻接表两种储存结构,做课程设计、实验报告或者数据结构学习者可以参考参考啊``源代码都是我亲手打的,...
本资料包涵盖了三种主要的搜索算法:深度优先搜索(DFS)、广度优先搜索(BFS)以及A*搜索算法,并结合了动态规划这一重要的优化策略。以下是对这些知识点的详细解释: 1. 深度优先搜索(DFS): DFS是一种用于遍历...
用邻接矩阵来存储图,Floyed算法求任意两点间的最短路径并输出,广度优先遍历,深度优先遍历
This program uses a int type number to represent the Eight Puzzle Problem. number 1,2,3,…,8 stand for the eight numbers,0 stand for blank space. row from top to bottom,column from left to right. ...
题目“bfs.rar_hdu”暗示了这是一个关于广度优先搜索(Breadth-First Search, BFS)的问题,源自HDU(杭州电子科技大学)的在线编程竞赛平台。通常,这类题目会涉及图论或者树的遍历,考察算法实现和逻辑思维能力。 ...
"acm课件搜索(杭电)(HDU)"这个主题聚集了相关的学习材料,特别是针对搜索算法的讲解,旨在帮助学生快速掌握并应用这些技术。 搜索算法在ACM竞赛中扮演着至关重要的角色,常见的搜索策略包括深度优先搜索(DFS)...
由于BFS保证了最早发现的目标状态是最短路径上的状态,因此它是解决魔方这类问题的有效方法。 接下来是“魔方降群法”。降群法是一种将复杂问题简化为更小、更易处理的子问题的方法。在魔方中,降群是指将一个完整...
BFS++ 是西门子一个优秀的资产管理软件。主要应用于电厂等大型资产密集型企业。
标题中的“列表实现岛屿数量(DFS+BFS)”是指在一个二维网格中,通过深度优先搜索(DFS)和广度优先搜索(BFS)算法来计算由‘1’(陆地)组成的岛屿的数量。这个问题通常出现在数据结构和算法的练习中,如LeetCode...
**标题中的“bfs.rar_BFS+c++_bfs”表明这是一个关于C++实现BFS算法的压缩包文件,可能包含了一个名为“bfs”的源代码文件。** **描述中的“this is code for bfs in c++”进一步确认了这个压缩包内代码的主要功能...
题解:Bfs找最短路径(正解,绝对正确)这是c++中一道题的题解
**BFS++培训资料概述** BFS++是一个专为电厂生产管理设计的综合系统,它融合了网络技术和数据库管理,核心目标是对电厂设备的运行与维修进行高效管理。该系统涵盖了六个关键模块,分别是基本系统、设备数据管理、...
节点维护各自主链,有更新套用现成BFS广度搜索算法,预先遍历整个连通节点。最终结果导致空间溢出,只有80分,有点小遗憾。 下面展示一些 内联代码片。 #include using namespace std; const int maxn=501; ...
【杭电ACM训练PPT】是一套针对编程竞赛,特别是杭州电子科技大学(HDU)ACM团队训练的教程资料。这些PPT涵盖了多种算法和数学概念,旨在提升参赛者在算法设计和问题解决上的能力。以下是各部分的详细解释: 1. **二...