Floyd 求最短路(poj 1161)
Floyd-Warshall算法介绍:
Floyd-Warshall算法的原理是动态规划。
设
为从
到
的只以
集合中的节点为中间节点的最短路径的长度。
- 若最短路径经过点k,则
; - 若最短路径不经过点k,则
。
因此,
。
在实际算法中,为了节约空间,可以直接在原来空间上进行迭代,这样空间可降至二维。
let dist be a |V| × |V| array of minimum distances initialized to ∞ (infinity)
for each vertex v
dist[v][v] ←
for each edge (u,v)
dist[u][v] ← w(u,v) // the weight of the edge (u,v)
for k from to |V|
for i from to |V|
for j from to |V|
if dist[i][j] > dist[i][k] + dist[k][j]
dist[i][j] ← dist[i][k] + dist[k][j]
end if
题目:Walls
题意:给定一个图,求其中几个点相连最少要穿越的边数。
思路:这题的图要重新建,不能用原图,新图是这样的:将一个圈化为点,之间的关系是两个圈是否有公共边,然后就是求最短路问题了;
#include <iostream>
#include <algorithm>
#include <stdlib.h>
#include <time.h>
#include <cmath>
#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
#include <queue>
#include <stack>
#include <set> #define c_false ios_base::sync_with_stdio(false); cin.tie(0)
#define INF 0x3f3f3f3f
#define INFL 0x3f3f3f3f3f3f3f3f
#define zero_(x,y) memset(x , y , sizeof(x))
#define zero(x) memset(x , 0 , sizeof(x))
#define MAX(x) memset(x , 0x3f ,sizeof(x))
#define swa(x,y) {LL s;s=x;x=y;y=s;}
using namespace std ;
#define N 500 const double PI = acos(-1.0);
typedef long long LL ;
int mapp[N][N], region[N][N], p_num[N], n, m, r;
struct Person{
int adr;
int t; ///所在环数;
int reg[N]; ///环
}person[N]; int find_dis(int i, int j){ ///寻找i,j 两区域间的边,若没有,返回-1
int ii, jj;
for(ii = ; ii <= p_num[i]; ii++){
for(jj = ; jj <= p_num[j]; jj++){
if(region[i][ii] == region[j][jj]){
if(region[i][ii+] == region[j][jj+] || region[i][ii+] == region[j][jj-] ||
region[i][ii-] == region[j][jj+] || region[i][ii-] == region[j][jj-])
return ;
}
}
}
return -;
} void Floyd(){ ///寻找最短路
int i, j, k;
for(k = ; k<= m; k++)
for(i = ; i<= m; i++)
for(j = ; j<= m; j++)
mapp[i][j] = mapp[j][i] = min(mapp[i][j], mapp[i][k]+mapp[k][j]);
} int search_(int i){ //查找i区域到俱乐部每个成员间的距离和;
int j, k, s = ;
for(j = ; j<= r;j++){
int d = INF;
for(k = ; k <=person[j].t; k++)
d = min(d, mapp[person[j].reg[k]][i]);
s+=d;
}
return s;
}
int main(){
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int i,j,k;
while(~scanf("%d",&m)){
scanf("%d%d",&n,&r);
for(i = ; i<= r;i++){
scanf("%d",&person[i].adr);
person[i].t = ;
}
for(i = ; i <= m; i++){
scanf("%d", &p_num[i]);
for(j = ; j <= p_num[i]; j++){
scanf("%d", ®ion[i][j]);
for(k = ; k <= r; k++){
if(person[k].adr == region[i][j])
person[k].reg[ ++person[k].t] = i;
}
}
region[i][] = region[i][ p_num[i] ];
region[i][p_num[i]+] = region[i][];
}
for(i = ; i <= m; i++){
for(j = ; j<=m; j++){
if(i == j){
mapp[i][j] = mapp[j][i] = ;continue;
}
int ans = find_dis(i, j);
if(ans == ) mapp[i][j] = mapp[j][i] =;
else mapp[i][j] = mapp[j][i] =INF;
}
}
Floyd();
int min_dis = search_();
for(i = ; i <=m ;i++){
int d =search_(i);
min_dis = min(d, min_dis);
}
printf("%d\n",min_dis);
}
return ;
}
Floyd 求最短路(poj 1161)的更多相关文章
- dijkstra,SPFA,Floyd求最短路
Dijkstra: 裸的算法,O(n^2),使用邻接矩阵: 算法思想: 定义两个集合,一开始集合1只有一个源点,集合2有剩下的点. STEP1:在集合2中找一个到源点距离最近的顶点k:min{d[k] ...
- 854. Floyd求最短路(模板)
给定一个n个点m条边的有向图,图中可能存在重边和自环,边权可能为负数. 再给定k个询问,每个询问包含两个整数x和y,表示查询从点x到点y的最短距离,如果路径不存在,则输出“impossible”. 数 ...
- AcWing 854. Floyd求最短路 多源 邻接矩阵
//不存在负权回路 //边权可能为负数 #include <cstring> #include <iostream> #include <algorithm> us ...
- 【POJ - 2139】Six Degrees of Cowvin Bacon (Floyd算法求最短路)
Six Degrees of Cowvin Bacon Descriptions 数学课上,WNJXYK忽然发现人缘也是可以被量化的,我们用一个人到其他所有人的平均距离来量化计算. 在这里定义人与人的 ...
- POJ 1161 Walls(最短路+枚举)
POJ 1161 Walls(最短路+枚举) 题目背景 题目大意:题意是说有 n个小镇,他们两两之间可能存在一些墙(不是每两个都有),把整个二维平面分成多个区域,当然这些区域都是一些封闭的多边形(除了 ...
- POJ 2251 Dungeon Master --- 三维BFS(用BFS求最短路)
POJ 2251 题目大意: 给出一三维空间的地牢,要求求出由字符'S'到字符'E'的最短路径,移动方向可以是上,下,左,右,前,后,六个方向,每移动一次就耗费一分钟,要求输出最快的走出时间.不同L层 ...
- POJ 3660 Cow Contest (floyd求联通关系)
Cow Contest 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/H Description N (1 ≤ N ≤ 100) ...
- POJ 3660 Cow Contest(Floyd求传递闭包(可达矩阵))
Cow Contest Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16341 Accepted: 9146 Desc ...
- FLOYD 求最小环
首先 先介绍一下 FLOYD算法的基本思想 设d[i,j,k]是在只允许经过结点1…k的情况下i到j的最短路长度则它有两种情况(想一想,为什么):最短路经过点k,d[i,j,k]=d[i,k,k- ...
随机推荐
- “NOT_IN”与“NULL”的邂逅
今天处理了一个因“NOT IN”与“NULL”邂逅导致的问题,值得思考和总结,记录在此,供参考.(感谢John抛出的问题) 我们以实验的形式先再现一下这个问题,然后对其分析,最后给出几种解决方案. 1 ...
- TEST设置
- 黑马程序员_ C语言基础(一)
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------ 开发过程: 编写->编译(只编译源文件,编译成*.o 只会检测语法是否合理,不会检测函数是 ...
- .net实现调用本地exe等应用程序的办法总结
根据客户需求用户要实现在一个BS系统上打开本地的一应用程序,在网上查了好多资料再加上自己的各种测试,到最后功能是实现了,只不过还存在一些问题,接下来会先把各种方法一一列举出来 1.先写最终测试通过的这 ...
- 网站搭建 so easy
服务器(国际购买):http://www.gigsgigscloud.com/ 域名(阿里云): 解析到服务器 服务器需要安装 1.putty 2.CuteFTP(自己感觉这个靠谱点) / ...
- 路由器WDS实际案例
背景环境: 我家在农村,由于是农村,虽然现在村里迁了网线,但是用户毕竟还是很少的,我家常年都在外面打工,就过年过节回来十几二十天,想上网,不值得迁网线,所以选择不道德的蹭网. 由于手机的信号并没有专业 ...
- Python之路【第十六篇】:Django【基础篇】
Python之路[第十六篇]:Django[基础篇] Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了O ...
- Eclipse 和 HSQLDB: 将关系数据库服务器嵌入到 Eclipse 中,第 2 部分
HSQLDB 开发者角色 对 HSQLDB 与 Eclipse 工作台的集成感兴趣的开发者可以很容易地被分为两类: 客户机开发者,他们只是用 HSQLDB 来存储数据. 引擎开发者,他们通过添加新的标 ...
- Linux_06------Linux的磁盘管理
进制编码 * 3.格式化交换分区 * 4.启用交换分区 * * 1.2. * fdisk /dev/sdb * p * t * 6(分区编号) * L(查看编码列表),找到SWAP交换分区标号 * 8 ...
- Great StackOverflow questions
1. diffenece between MVC and MVP http://stackoverflow.com/questions/2056/what-are-mvp-and-mvc-and-wh ...