`
huyifan951124
  • 浏览: 83182 次
社区版块
存档分类
最新评论

POj3259

 
阅读更多

题目大意:有n个村庄,村庄之间有m条正常的路,有w条时光隧道,隧道的权值为负数即时空倒流,问你他能否回到起始点看到自己。

算法思想:只要从任意一点出发,看这个点出发是否有负环,并且这个负环是回到起始点的。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define INF 0x3f3f3f3f
typedef struct Edge
{
    int u;
    int v;
    int c;
};
Edge edges[5050];
bool visited[505],isOver;
int next[5050],head[505],dist[505],num[505];
int t;
int n,m,w,e;
int a,b,c;
int a1,b1,c1;
void addNode(int u,int v,int c)
{
    edges[e].u=u;
    edges[e].v=v;
    edges[e].c=c;
    next[e]=head[u];
    head[u]=e++;
}
bool relax(int u,int v,int c)
{
    if(dist[v]>dist[u]+c)
    {
        dist[v]=dist[u]+c;
        return true;
    }
    return false;
}
bool spfa(int src)
{
    for(int i=1;i<=n;i++)
    {
        dist[i]=INF;
    }
    dist[src]=0;
    memset(visited,false,sizeof(visited));
    memset(num,0,sizeof(num));
    visited[src]=true;
    queue<int>que;
    que.push(src);
    while(!que.empty())
    {
        int q=que.front();
        que.pop();
        visited[q]=false;
        for(int i=head[q];i+1;i=next[i])
        {
            if(relax(q,edges[i].v,edges[i].c)&&!visited[edges[i].v])
            {
                if(++num[edges[i].v]>n)
                    return false;
                visited[edges[i].v]=true;
                que.push(edges[i].v);
            }
        }

    }

    return true;

}
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        memset(head,-1,sizeof(head));
        memset(next,-1,sizeof(next));
        memset(edges,0,sizeof(edges));
        e=0;isOver=false;
        scanf("%d%d%d",&n,&m,&w);

        for(int i=0;i<m;i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            addNode(a,b,c);
            addNode(b,a,c);
        }
        for(int i=0;i<w;i++)
        {
            scanf("%d%d%d",&a1,&b1,&c1);
            addNode(a1,b1,-c1);
        }
        for(int i=1;i<=n;i++)
        {
            if(!spfa(i)&&dist[i]<=0)
            {
                isOver=true;
                printf("YES\n");
                break;
            }
        }
        if(!isOver)
            printf("NO\n");

    }
    return 0;
}


 

分享到:
评论

相关推荐

    POJ3259-Wormholes【Bellman】

    【标题】"POJ3259-Wormholes【Bellman】"是一个编程竞赛题目,源自北京大学的在线判题系统POJ(Problem Online Judge)。这个题目主要涉及图论中的一个算法——贝尔曼-福特(Bellman-Ford)算法。 【描述】"北大POJ...

    POJ3259--Wormholes(bellman).rar_wormhole code _wormholes

    标题中的“POJ3259--Wormholes(bellman)”是指一个编程竞赛问题,源自POJ(Programming Online Judge)平台。这个问题涉及到利用贝尔曼-福特算法(Bellman-Ford Algorithm)解决“虫洞”(Wormholes)的问题。在...

    北大POJ初级-所有题目AC代码+解题报告

    【标题】"北大POJ初级-所有题目AC代码+解题报告" 涉及的知识点主要集中在编程、算法和在线判题系统方面。北京大学(Peking University, 简称PKU)的POJ(Peking University Online Judge)是一个为计算机科学爱好者...

    poj题目分类

    * 最短路径算法:例如 Dijkstra、Bellman-Ford、Floyd、Heap+Dijkstra,例如 poj1860、poj3259、poj1062、poj2253、poj1125、poj2240。 * 最小生成树算法:例如 Prim、Kruskal,例如 poj1789、poj2485、poj1258、...

    POJ算法题目分类

    * 图的深度优先遍历和广度优先遍历:图的深度优先遍历和广度优先遍历是指遍历图的两种方式,如 poj1860、poj3259、poj1062、poj2253、poj1125、poj2240。 * 最短路径算法:最短路径算法是指计算图中两点之间的最短...

    poj训练计划.doc

    - 图的深度优先遍历和广度优先遍历:用于探索图的所有节点,如`poj1860, poj3259`。 - 最短路径算法:如Dijkstra算法和Bellman-Ford算法,用于找到两点间的最短路径,如`poj1062, poj2253`。 - 最小生成树算法:...

    POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类

    - **例题**:poj1860, poj3259, poj1062, poj2253, poj1125, poj2240 - **解释**:最短路径算法包括Dijkstra算法、Bellman-Ford算法、Floyd算法以及堆优化的Dijkstra算法等。 ##### (3) 最小生成树算法 - **例题**...

    poj各种分类

    包括深度优先遍历(DFS)和广度优先遍历(BFS),用于探索图的所有节点,是解决许多图问题的基础,如poj1860和poj3259所示。 #### 最短路径算法 Dijkstra算法、Bellman-Ford算法和Floyd算法分别适用于无负权边、有...

    POJ 分类题目 txt文件

    例如,题目poj1860和poj3259就是典型的最短路径问题。 ### 3. 数据结构 数据结构部分包括数组、链表、栈、队列、树、堆、哈希表等,它们在存储和访问数据时提供不同的效率和特性。哈希表(Hash)是一种高效的数据...

    acm训练计划(poj的题)

    - (poj1860, poj3259, poj1062, poj2253, poj1125, poj2240):介绍迪杰斯特拉算法(Dijkstra)、贝尔曼-福特算法(Bellman-Ford)、弗洛伊德算法(Floyd)等。 - 使用堆优化的迪杰斯特拉算法。 3. **最小生成树...

    acm poj300题分层训练

    如poj3278、poj2049、poj3083是图遍历的例子,poj1860、poj3259等则是最短路径问题,poj1789、poj2485等则涉及最小生成树。 3. **数据结构**:包括串、排序、简单并查集、哈希表、二分查找、哈夫曼树和堆。poj1035、...

    经典 的POJ 分类

    - POJ 1860、POJ 3259:利用Dijkstra算法解决最短路径问题。 - POJ 1062、POJ 2253:涉及Bellman-Ford算法的应用场景。 - POJ 1125、POJ 2240:Floyd算法的典型实例。 ##### 最小生成树 - **算法**: - Prim...

    acm新手刷题攻略之poj

    ### ACM新手刷题攻略之POJ ... - 推荐题目:[poj1860](https://vjudge.net/problem/POJ-1860)、[poj3259](https://vjudge.net/problem/POJ-3259)、[poj1062](https://vjudge.net/problem/POJ-1062)、[poj2253]...

    ACM-POJ 算法训练指南

    1. **最短路径**:Dijkstra算法、Bellman-Ford算法、Floyd算法等,用于寻找两点间最短路径(poj1860, poj3259, poj1062, poj2253, poj1125, poj2240)。 2. **最小生成树**:Prim算法和Kruskal算法,用于构建图的...

    POJ 分类题目

    - poj3259 - poj1062 - poj2253 - poj1125 - poj2240 - **应用场景**:适用于寻找两点之间的最短路径问题。 **3. 最小生成树算法** - **定义**:包括 Prim 算法和 Kruskal 算法。 - **示例题目**: - poj1789...

    POJ题目分类

    - **示例题目**: poj1860, poj3259, poj1062, poj2253, poj1125, poj2240 - **知识点**: - **Dijkstra算法**:适用于带非负权重的有向图和无向图,可以求出图中某一个顶点到其他所有顶点的最短路径。 - **Bellman-...

    ACMer需要掌握的算法讲解 (2).docx

    * 构造法:POJ3295、POJ3259、POJ1062、POJ2253、POJ1125、POJ2240 * 最小生成树算法:prim、kruskal、POJ1789、POJ2485、POJ1258、POJ3026 * 拓扑排序:POJ1094 * 串算法:POJ1035、POJ3080、POJ1936 * 哈希表和二...

    ACM常用算法及其相应的练习题.docx

    + poj1860, poj3259, poj1062, poj2253, poj1125, poj2240 * 最小生成树算法:prim, kruskal + poj1789, poj2485, poj1258, poj3026 * 拓扑排序:poj1094 * 二分图的最大匹配:匈牙利算法 + poj3041, poj3020 * ...

    ACM 详解算法目录

    例如,POJ1860和POJ3259是最短路径算法的典型例题,而POJ1789和POJ2485则是最小生成树算法的经典例题。 数据结构部分涵盖了串、排序、简单并查集、哈希表和二分查找、哈夫曼树、堆和trie树八个方面。例如,POJ1035...

Global site tag (gtag.js) - Google Analytics