题目

https://www.luogu.org/problemnew/show/P2738

思路

这一道题有3个难点:

(1)每一条边都有编号,感觉有些麻烦:

认真看题可以发现“边的标号s(1<=s<=N)”,也就是说只是把边

的顺序打乱而已,我们就不用管这么多,直接放上去边的编号,然后搜索的时候1-n

(2)这一道题的主要难点————找最小的环的大小:

这个dfs或者bfs都可以,不过bfs每一个队列都要用结构体带一个数组,但是dfs是一次搜到底,所以采用dfs来做

这里还要注意一个细节,查找只用找一边,因为环是两面想通的,所以找一边即可

首先在主函数里面for(i=1;i<=n;i++),优化一下每次搜索完

开始的那一条边就把这一条边设置为不能走,因为以后搜索

到这一条又会把以前搜过的再搜一次,浪费了很多时间

(3)边的方向:

因为这是无向边,所以得注意一下方向.

输入的时候把左边的变设置为1,右边的边设置为2

搜索的时候假如在边的左边必须到右边去,右边就必须到左边去,每次走都要加上距离

从一条边的左边走到另一条边,你还是在你现在所在的边的左边

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
const int MAXN=177;
ll n;
ll a[MAXN][MAXN],d[MAXN],ans=0,minn=0x3f3f3f3f3f3f3f3f;
bool v[MAXN],bk[MAXN];
void dfs(ll k,ll t,ll flag)
{if(ans>=minn) return;if(k==flag){minn=ans;return;}for(ll i=1;i<=n;i++){if(v[i]==1 && bk[i]==1 && a[k][i]==3-t){v[i]=0;ans=ans+d[i];dfs(i,a[i][k],flag);v[i]=1;ans=ans-d[i];}}
}
int main()
{ll i,j,t,t1,x,y;scanf("%lld",&n);for(i=1;i<=n;i++){scanf("%lld",&t);scanf("%lld%lld%lld",&d[t],&x,&y);for(j=1;j<=x;j++){scanf("%lld",&t1);a[t][t1]=1;}for(j=1;j<=y;j++){scanf("%lld",&t1);a[t][t1]=2;}}memset(bk,1,sizeof(bk));for(i=1;i<=n;i++){memset(v,1,sizeof(v));ans=0;for(j=i+1;j<=n;j++){   if(a[i][j]==1){v[j]=0;ans=ans+d[j];dfs(j,a[j][i],i);v[j]=1;ans=ans-d[j];}}bk[i]=0;}printf("%lld\n",minn);return 0;
}

篱笆回路Fence Loops相关推荐

  1. 洛谷 P2738 [USACO4.1]篱笆回路Fence Loops

    P2738 [USACO4.1]篱笆回路Fence Loops 题目描述 农夫布朗的牧场上的篱笆已经失去控制了.它们分成了1~200英尺长的线段.只有在线段的端点处才能连接两个线段,有时给定的一个端点 ...

  2. 洛谷P2738 [USACO4.1]篱笆回路Fence Loops 题解

    洛谷P2738 [USACO4.1]篱笆回路Fence Loops 题解 题目链接:P2738 [USACO4.1]篱笆回路Fence Loops 题意:农夫布朗的牧场上的篱笆已经失去控制了.它们分成 ...

  3. USACO4.1 篱笆回路Fence Loops

    题意 有N(1<=N<=100)条双向边,我们知道每条边的三个属性:边的长度,边的一端所连接的边,边的另一端所连接的边.边不连接自身,且只在端点处连接其他边.求其中的最小环. 输入格式 第 ...

  4. 洛谷P2738 [USACO4.1]篱笆回路Fence Loops(Floyed求最小环)

    Floyd 多源最短路 && 传递闭包 && 最小环:http://blog.csdn.net/wzw1376124061/article/details/698701 ...

  5. P2738 [USACO4.1]篱笆回路Fence Loops

    题目描述 农夫布朗的牧场上的篱笆已经失去控制了.它们分成了1~200英尺长的线段.只有在线段的端点处才能连接两个线段,有时给定的一个端点上会有两个以上的篱笆.结果篱笆形成了一张网分割了布朗的牧场.布朗 ...

  6. USACO 4.1.3 篱笆回路 (floyd找最小环)

    [USACO4.1.3]Fence Loops篱笆回路 问题描述 农夫布朗的牧场上的篱笆已经失去控制了.它们分成了1~200英尺长的线段.只有在线段的端点处才能连接两个线段,有时给定的一个端点上会有两 ...

  7. 题解:篱笆回路 - 图论 哈希

    Fence Loops 篱笆回路 Time Limit: 1 Sec Memory Limit: 128 MB Description 农夫布朗的牧场上的篱笆已经失去控制了.它们分成了1~200 英尺 ...

  8. 编程算法 - 篱笆修理(Fence Repair) 代码(C)

    篱笆修理(Fence Repair) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 把一块木板切成N块, 每次切两块, 分割的开销是木板长度, ...

  9. usaco Fence Loops

    一开始完全没思路,百度了一下了解到是用floyd求最小环,于是我去百度了一下这个算法了解到了很多我之前不了解的flyod算法.好了既然知道用啥算法就写吧,然后发现懵逼了.这题是边的序号没有点.得自己化 ...

最新文章

  1. json数据解析_ORACLE中Clob字段在不同数据库间自由地飞翔——SQL+JSON字段解析
  2. HP 520 双系统 vista xp
  3. 地址栏中的问号有什么作用
  4. Windows 2003 NTP 时间服务器设置
  5. Python3中遇到UnicodeEncodeError: ‘ascii‘ codec can‘t encode characters in ordinal not in range(128)
  6. 损失函数一直不变_MIT 18.03 微分方程笔记 3.4 狄拉克δ函数
  7. 信息学奥赛C++语言:三个数的大小比较
  8. java8种定位_python基础教程:8种selenium元素定位的实现
  9. 开课吧Java课堂:如何使用比较函数?
  10. wait方法为什么要放在循环里
  11. 平面2R机器人(二连杆)运动学与动力学建模+附仿真模型
  12. Integer计算保留小数点位数
  13. 名帖52 王献之 小楷《洛神赋》
  14. 城市亮化工程项目方案
  15. 【Flink】Flink中的窗口API、窗口函数以及迟到数据处理问题
  16. 注册表编辑器被改这样恢复
  17. go语言文件写入追加
  18. android客户端和服务端交互,谈谈android客户端和网站数据交互的实现
  19. 「洗脑」利用了哪些心理学原理?人脑发生了哪些生理变化?
  20. 景德镇学院计算机应用技术,景德镇学院 - 信息工程学院

热门文章

  1. java.sql.SQLException: 无效的列类型
  2. uniapp页面通讯-uni.$emit、uni.$on、uni.$once、uni.$off
  3. C语言编程>第三周 ④ 求100之内的素数。
  4. 计算机基础2008版,《计算机基础(2008版)》第4次作业
  5. Vue element 自定义表单验证(验证联系方式、邮箱、邮政编码)
  6. Oracle分区表操作
  7. Elasticsearch一网打通
  8. TestNG测试报告美化buid.xml配置
  9. SDRAM的工作原理
  10. Qt::​Alignment 设置对齐方式