CSUOJ-1978 LXX的图论题(最短路、Bellman-Ford判断负圈)

1978: LXX的图论题

Time Limit: 1 Sec     Memory Limit: 128 Mb     Submitted: 22     Solved: 9


Description

由于lxx的图论和数据结构太弱了,大佬Z决定为lxx补一补。于是大佬Z为lxx出了一道题目,题目如下:给出一张有向图,图中有n个点,m条边,每条边上都有一个权值w,问图中是否存在满足以下条件的点i,j,...p使得不等式w[i][j] * w[j][k] * .... * w[p][i]<1成立。奈何lxx太弱了,他决定寻求你的帮助。

Input

多组输入,以文件结尾。第一行两个整数n( 1<=n<=500 ),m( 1<=m<=n*(n-1)/2 ),接下来m行,每行3个数x,y,z,(x≠y):表示x到y有一条边,权值为z(0<z<20,且保证z小数点后面最多只有一位)。

Output

如果存在满足题目所描述的式子,输出“YES”,否则输出“NO”。

Sample Input

2 2
1 2 0.9
2 1 1.2
6 4
1 2 0.1
2 4 0.8
4 1 12
4 1 15

Sample Output

NO
YES

Hint

点的编号为1~n

Source

2017年8月月赛

题目大意:能否在一个有向图中找到一个环,使环上所有边权的乘积小于1。

思路:利用对数的性质,将累加变成累乘。各边取对数作为权值,然后套Bellman-Ford模板判断是否有负圈即可。

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=505;
const int maxm=125005;
const double INF=100;
double d[maxn];
int n,m;
struct edge
{
    int from,to;
    double cost;
};
edge es[maxm];

bool find_negative_loop()
{
    memset(d,0,sizeof(d));

    for(int i=1;i<=n;i++)
    {
        for(int j=0;j<m;j++)
        {
            edge e = es[j];
            if(d[e.to]>d[e.from]+e.cost)
            {
                d[e.to] = d[e.from] +e.cost;

                //如果第n次仍然更新了,则存在负圈
                if(i==n)
                    return true;
            }
        }
    }
    return false;
}

int main()
{
    while(scanf("%d %d",&n,&m)!=EOF)
    {
        int i,j,k,a,b;
        double c;
        k=0;
        for(i=0;i<m;i++)
        {
            scanf("%d %d %lf",&a,&b,&c);
            es[k].from = a;
            es[k].to = b;
            es[k].cost = log(c);
            k++;
        }
        if(find_negative_loop())
        {
            printf("YES\n");
        }
        else
        {
            printf("NO\n");
        }
    }
}
时间: 2024-10-13 14:42:31

CSUOJ-1978 LXX的图论题(最短路、Bellman-Ford判断负圈)的相关文章

csu 1978: LXX的图论题

1978: LXX的图论题 Submit Page   Summary   Time Limit: 1 Sec     Memory Limit: 128 Mb     Submitted: 71     Solved: 27 Description 由于lxx的图论和数据结构太弱了,大佬Z决定为lxx补一补.于是大佬Z为lxx出了一道题目,题目如下:给出一张有向图,图中有n个点,m条边,每条边上都有一个权值w,问图中是否存在满足以下条件的点i,j,...p使得不等式w[i][j] * w[j]

【最短路】 ZOJ 1544 Currency Exchange 判断负圈

给出 N 种货币 M 条兑换关系 开始时所有的货币S 和有X 块钱 接下来M条关系 A B W1 W2 W3 W4 表示 A->B 所需的手续费为W2块钱  汇率为W1 B->A 所需的手续费为W4块钱  汇率为W3 所以对于输入的一行建两条边 要求到最后可以赚到钱 所以当出现了负圈即可赚到无限多的钱 #include <cstdio> #include <cstdlib> #include <cstring> #include <climits>

图论常用算法之一 POJ图论题集【转载】

POJ图论分类[转] 一个很不错的图论分类,非常感谢原版的作者!!!在这里分享给大家,爱好图论的ACMer不寂寞了... (很抱歉没有找到此题集整理的原创作者,感谢知情的朋友给个原创链接) POJ:http://poj.org/ 1062* 昂贵的聘礼 枚举等级限制+dijkstra 1087* A Plug for UNIX 2分匹配 1094 Sorting It All Out floyd 或 拓扑 1112* Team Them Up! 2分图染色+DP 1125 Stockbroker

hdu 4885 (n^2*log(n)判断三点共线建图)+最短路

题意:车从起点出发,每次只能行驶L长度,必需加油到满,每次只能去加油站或目的地方向,路过加油站就必需进去加油,问最小要路过几次加油站. 开始时候直接建图,在范围内就有边1.跑最短了,再读题后发现,若几个点共线,且都在范围内,那么中间有点的俩头的点就不能有边,否则与条件相悖.关键是怎么用n^2*logn,的复杂度判断三点共线:点先按X排序,考察每个点i时候,第二个点j,若直线ij斜率已经存在,则不能添加了,查找是否存在,用容器就行(map\set)都是logn的,所以满足要求.之后最短路即可. #

不会的图论题

列一下曾经做过的不会的图论题 bzoj4398: 福慧双修 bzoj4681: [Jsoi2010]旅行 NEERC 2017 Problem J Journey from Petersburg to Moscow 原文地址:https://www.cnblogs.com/tkandi/p/10556829.html

从存图到最短路算法的图论总结

INTRODUCTION: 图论算法在计算机科学中扮演着很重要的角色,它提供了对很多问题都有效的一种简单而系统的建模方式.很多问题都可以转化为图论问题,然后用图论的基本算法加以解决.--百度百科 对于OI而言,图是指由若干给定的点及若干条连接两点的线(边)所构成的图形 借助图论知识,我们往往可以将一些复杂的问题转化到基础的图论算法上,进而使用已有算法解决全新问题 那么想如果想要运用图论,首先要从存图开始 前排感谢教我图论的周润喵老师,syc学长,就序老师 可是我还是没学会 一,存图 对于一个图而

POJ 3259 Wormholes【最短路/SPFA判断负环模板】

农夫约翰在探索他的许多农场,发现了一些惊人的虫洞.虫洞是很奇特的,因为它是一个单向通道,可让你进入虫洞的前达到目的地!他的N(1≤N≤500)个农场被编号为1..N,之间有M(1≤M≤2500)条路径,W(1≤W≤200)个虫洞.FJ作为一个狂热的时间旅行的爱好者,他要做到以下几点:开始在一个区域,通过一些路径和虫洞旅行,他要回到最开时出发的那个区域出发前的时间.也许他就能遇到自己了:).为了帮助FJ找出这是否是可以或不可以,他会为你提供F个农场的完整的映射到(1≤F≤5).所有的路径所花时间都

训练指南 UVA - 11090(最短路BellmanFord+ 二分判负环)

layout: post title: 训练指南 UVA - 11090(最短路BellmanFord+ 二分判负环) author: "luowentaoaa" catalog: true mathjax: true tags: - 最短路 - 基础DP - BellmanFord - 图论 - 训练指南 Going in Cycle!! UVA - 11090 题意 就最小的环的平均权值 题解 分枚举平均值mid,只需判断是否存在平均值小于mid的回路,即判断是否有sum(wi)&

算法复习:最短路Dijkstra - Ford - Floyd

Dijkstra算法适用范围是单源最短路,有向图或者无向图,不能处理负权值 Floyd算法适用多源最短路,有向图或者无向图,可以处理负权值但是不能处理负权回路 Ford 算法多源最短路,可以处理负权值,能检测负权回路 Leetcode 743. 网络延迟时间 先用Dijkstra算法解,输入是vector要转存一下,另外找的是最后一个传播到的节点所用时间 #define max 999999 #define CLR(donser,value) memset(donser,value,sizeof