poj 3259

题目概述

某人的农庄里有N个地点,编号1到N,地点之间有M条双向路,途径每条路需要一定时间,农庄里还有W个虫洞,虫洞都在各个地点里,虫洞是单向的,每次途径虫洞会使时间倒退一块,问该人从某点出发,可否令时间倒退到出发以前

时限

2000ms/6000ms

输入

第一行正整数times,其后times组数据,每组数据第一行正整数N,M,W,其后M行,每行三个整数,代表路连接的两个地点及其用时,其后W行,每行三个整数,代表虫洞起点终点及其倒流的时间

限制

1<=times<=5;1<=N<=500;1<=M<=2500;1<=W<=200;每条路用时<=10000;每个虫洞倒流时间<=10000

输出

每行一个字符串,若可以倒退,则为YES,否则为NO

样例输入

2
3 3 1
1 2 2
1 3 4
2 3 1
3 1 3
3 2 1
1 2 3
2 3 4
3 1 8

样例输出

NO
YES

讨论

图论,负权环判断,bellman_ford算法,不是队列优化的那个,这里用到了原版bellman_ford的优点,总是能在运行N-1轮后停下,因为每次都松弛了一个点,而最短路一共只有N个点,起点不用松弛,这一条是优化算法不具备的,因而统计运行次数,只要每次成功松弛了一个点,就可以再运行一次,只要运行次数到达N,就是有负权环
实现层面上,由于原版的是非常暴力的对每条边都松弛一次,因而根本不需要知道邻接表之类的,只要把所有边都存下,记好起点终点,每次遍历,松弛就可以了,不过需要注意方向的问题
分类的话……额不想单独开个新的分类了,就放到bellman_ford下吧

题解状态

200K,63MS,C++,1003B

题解代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#define INF 0x3f3f3f3f
#define MAXN 504
#define memset0(a) memset(a,0,sizeof(a))

int N, M, W;//地点数 路数 虫洞数
int from[2704], to[2704], w[2704], dis[MAXN];//起点 终点(对路而言不分起点终点) 时间(虫洞是负的)2700=2500+200 最短路长度
bool fun()
{
    for (int p = 0; p < M + W; p++)
        scanf("%d%d%d", &from[p], &to[p], &w[p]);//input//虫洞和路一视同仁的读入
    for (int p = 1; p <= N; p++)//初始化
        dis[p] = INF;
    dis[1] = 0;//起点不重要 哪个都一样
    bool f = 1;//flag 标记本次是否有成功倒流 也就是是否已产生最短路
    int cnt = 0;//运行次数
    while (f) {
        if (++cnt == N)//当运行第N次时就要停了
            return 1;
        f = 0;//没有倒流
        for (int p = 0; p < M; p++) {//处理路的情况 双向
            if (dis[to[p]]>dis[from[p]] + w[p])
                dis[to[p]] = dis[from[p]] + w[p];
            if (dis[from[p]]>dis[to[p]] + w[p])
                dis[from[p]] = dis[to[p]] + w[p];
        }
        for (int p = M; p < M + W; p++)//处理虫洞的情况 单向
            if (dis[to[p]]>dis[from[p]] - w[p]) {
                dis[to[p]] = dis[from[p]] - w[p];
                f = 1;//成功倒流
            }
    }
    return 0;//
}
int main(void)
{
    //freopen("vs_cin.txt", "r", stdin);
    //freopen("vs_cout.txt", "w", stdout);

    int times;
    scanf("%d", &times);//input
    while (times--) {
        scanf("%d%d%d", &N, &M, &W);//input
        if (fun())
            printf("YES\n");//output
        else
            printf("NO\n");//output
    }
}

EOF

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧农业是一种结合了现代信息技术,包括物联网、大数据、云计算等,对农业生产过程进行智能化管理和监控的新模式。它通过各种传感器和设备采集农业生产中的关键数据,如大气、土壤和水质参数,以及生物生长状态等,实现远程诊断和精准调控。智慧农业的核心价值在于提高农业生产效率,保障食品安全,实现资源的可持续利用,并为农业产业的转型升级提供支持。 智慧农业的实现依赖于多个子系统,包括但不限于设施蔬菜精细化种植管理系统、农业技术资料库、数据采集系统、防伪防串货系统、食品安全与质量追溯系统、应急追溯系统、灾情疫情防控系统、农业工作管理系统、远程诊断系统、监控中心、环境监测系统、智能环境控制系统等。这些系统共同构成了一个综合的信息管理和服务平台,使得农业生产者能够基于数据做出更加科学的决策。 数据采集是智慧农业的基础。通过手工录入、传感器自动采集、移动端录入、条码/RFID扫描录入、拍照录入以及GPS和遥感技术等多种方式,智慧农业系统能够全面收集农业生产过程中的各种数据。这些数据不仅包括环境参数,还涵盖了生长状态、加工保存、检验检疫等环节,为农业生产提供了全面的数据支持。 智慧农业的应用前景广阔,它不仅能够提升农业生产的管理水平,还能够通过各种应用系统,如库房管理、无公害监控、物资管理、成本控制等,为农业生产者提供全面的服务。此外,智慧农业还能够支持政府监管,通过发病报告、投入品报告、死亡报告等,加强农业产品的安全管理和质量控制。 面对智慧农业的建设和发展,存在一些挑战,如投资成本高、生产过程标准化难度大、数据采集和监测的技术难题等。为了克服这些挑战,需要政府、企业和相关机构的共同努力,通过政策支持、技术创新和教育培训等手段,推动智慧农业的健康发展。智慧农业的建设需要明确建设目的,选择合适的系统模块,并制定合理的设备布署方案,以实现农业生产的智能化、精准化和高效化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值