[USACO4.1]篱笆回路Fence Loops
题目:USACO Training 4.1(在官网上提交需加文件输入输出)、洛谷P2738。
题目大意:给你一张图里的边集,让你求出这张图的最小环。
解题思路:求最小环很简单,用Floyd即可。最重要的是,该题给你的是边集而不是点集,所以构图是关键。
我是这么构图的:设当前边的编号为$x$,我们先把它左端点编号设为$2x-1$,右端点编号设为$2x$,然后用$dy[p]$表示编号为$p$的点实际是第几个点(意思大致是,先假设每条边是独立的,然后把端点进行合并。例如2号边和3号边的左端点相连,则dy[2*2-1]=dy[3*2-1]=(合并后的那个点的编号))。具体见代码实现。
我写好建图的代码后又被一个东西坑了:样例里边读入时是排好序的,于是我认为数据里也是这些,然后就WA了TAT……所以得先把边按编号排序,然后建图。
C++ Code:
#include<cstdio>
#include<algorithm>
#include<cstring>
#define ls(i) (i*2-1)
#define rs(i) (i*2)
using namespace std;
int n,m=0,dis[320][320],p[320][320],dy[240];
struct Edge{
int s,l,lk,rk;
int a[2][120];
bool b[2][120];
bool operator <(const Edge& rhs)const{return s<rhs.s;}
}e[120];
void init(){//读入
scanf("%d",&n);
memset(e,0,sizeof(e));
for(int i=1;i<=n;++i){
scanf("%d%d%d%d",&e[i].s,&e[i].l,&e[i].lk,&e[i].rk);
for(int j=1;j<=e[i].lk;++j){
int x;
scanf("%d",&x);
e[i].a[0][j]=x;
e[i].b[0][x]=true;
}
for(int j=1;j<=e[i].rk;++j){
int x;
scanf("%d",&x);
e[i].a[1][j]=x;
e[i].b[1][x]=true;
}
}
sort(e+1,e+n+1);
}
void build_graph(){//建图
memset(dy,-1,sizeof dy);
memset(p,0x1f,sizeof p);
for(int i=1;i<=n;++i){
for(int j=1;j<=e[i].lk;++j){
int v=e[i].a[0][j];
if(e[v].b[0][i]&&dy[ls(v)!=-1])dy[ls(i)]=dy[ls(v)];else
if(e[v].b[1][i]&&dy[rs(v)!=-1])dy[ls(i)]=dy[rs(v)];
if(dy[ls(i)]!=-1)break;
}
if(dy[ls(i)]==-1)dy[ls(i)]=++m;
for(int j=1;j<=e[i].rk;++j){
int v=e[i].a[1][j];
if(e[v].b[0][i]&&dy[ls(v)]!=-1)dy[rs(i)]=dy[ls(v)];else
if(e[v].b[1][i]&&dy[rs(v)]!=-1)dy[rs(i)]=dy[rs(v)];
if(dy[rs(i)]!=-1)break;
}
if(dy[rs(i)]==-1)dy[rs(i)]=++m;
p[dy[ls(i)]][dy[rs(i)]]=p[dy[rs(i)]][dy[ls(i)]]=e[i].l;
}
}
int floyd(){//Floyd求最小环
int Min=0x1f1f1f1f;
memcpy(dis,p,sizeof dis);
for(int k=1;k<=m;++k){
for(int i=1;i<k;++i)
for(int j=i+1;j<k;++j)
Min=min(Min,dis[i][j]+p[i][k]+p[k][j]);
for(int i=1;i<=m;++i)
if(i!=k)
for(int j=1;j<=m;++j)
if(i!=j&&j!=k)
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
return Min;
}
int main(){
init();
build_graph();
printf("%d\n",floyd());
return 0;
}
[USACO4.1]篱笆回路Fence Loops的更多相关文章
- 洛谷P2738 [USACO4.1]篱笆回路Fence Loops
P2738 [USACO4.1]篱笆回路Fence Loops 11通过 21提交 题目提供者该用户不存在 标签USACO 难度提高+/省选- 提交 讨论 题解 最新讨论 暂时没有讨论 题目描述 ...
- 洛谷 P2738 [USACO4.1]篱笆回路Fence Loops
P2738 [USACO4.1]篱笆回路Fence Loops 题目描述 农夫布朗的牧场上的篱笆已经失去控制了.它们分成了1~200英尺长的线段.只有在线段的端点处才能连接两个线段,有时给定的一个端点 ...
- 题解 P2738 【[USACO4.1]篱笆回路Fence Loops】
这题是我期中测试的一题水题,然而英文题目太长了不想读...后面考完被同学提醒后20分钟切了(心塞) 切完看了波题解,发现貌似我的方法跟大家都不一样呢... 常规做法: \(Floyd\) 这个有三页的 ...
- USACO 4.1 Fence Loops(Floyd求最小环)
Fence Loops The fences that surround Farmer Brown's collection of pastures have gotten out of contro ...
- USACO 4.1 Fence Loops
Fence Loops The fences that surround Farmer Brown's collection of pastures have gotten out of contro ...
- 编程算法 - 篱笆修理(Fence Repair) 代码(C)
篱笆修理(Fence Repair) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 把一块木板切成N块, 每次切两块, 分割的开销是木板长度, ...
- USACO4.1 Fence Loops【最小环&边->点转化】
数据不是很大,如果要转换为正常的那种建图方式的话,可以给点进行标号,用一个二维数组存这两条边相交的那个点的标号,方便处理.一定要注意不要同一个点使用不同的编号也不要不同的点使用同一个编号(这不是废话嘛 ...
- USACO Section 4
前言 好久没更新这个系列了,最近闲的无聊写一下.有两题搜索懒得写了. P2737 [USACO4.1]麦香牛块Beef McNuggets https://www.luogu.com.cn/probl ...
- 浅谈Floyd的三种用法 By cellur925
Floyd大家可能第一时间想到的是他求多源最短路的n³算法.其实它还有另外两种算法的嘛qwq.写一发总结好了qwq. 一.多源最短路 放段代码跑,注意枚举顺序,用邻接矩阵存图.本质是一种动规. 复杂度 ...
随机推荐
- 路飞学城Python-Day24(practise)
本章总结 练习题 什么是C/S架构? C指的是client(客户端软件),S指的是Server(服务端软件)
- 使用jd-gui+javassist修改已编译好的class文件
1.原因:因为公司代码管理不当导致源码丢失,只好已编译好的class文件进行修改 2.首先先在myeclipse中新建java项目并导入javassist 3.将需要修改的文件放到指定文件夹下 4.. ...
- C文件I/O超详细教程
本文主要参考了C Primer Plus (5th & 6th Edition) 您可以选择本文的部分内容来读,有些内容对于不熟悉MS-DOS的读者可能过于晦涩难懂. C语言文件基本知识 文件 ...
- 详解 QT 主要类 QWidget
QWidget类是所有用户界面对象的基类,每一个窗口部件都是矩形,并且它们按Z轴顺序排列的.一个窗口部件可以被它的父窗口部件或者它前面的窗口部件盖住一部分. 先来看内容. AD: 2013云计算架构师 ...
- 使用iframe标签时如何通过jquery隐藏滚动条
通过mouseover和mouseout事件来控制iframe的滚动条 代码如下:
- STM32 的 printf() 函数串口重定向(HAL库标准库都适用)
1.建立工程 2.核心:添加新文件usar_fputc.c (名字随便自己命名),把文件添加到项目中去 #include "stdio.h" #include "stm3 ...
- 2015 Multi-University Training Contest 3 hdu 5324 Boring Class
Boring Class Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tota ...
- Sublime Text 3 Package Control安装
本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50618314 安装好Sublime T ...
- jquery-通过下拉菜单更改input日期
通过下拉菜单的选项,将文本框中的日期更改为当前日期的90天后 技巧: d.getMonth()是从0开始计算的,所以要加上1,d.getFullYear()才能取到当前的年份 $("#acc ...
- Cocos2d-x可以实现的动画效果
动作(Actions)move移动:moveto/moveby 从一个位置移动到另外一个位置 从一个位置移动多少数量级rotate旋转:rotateto/rotateby 从一个角度旋转到另外一个角度 ...