POJ3259 :Wormholes(SPFA判负环)

本文针对POJ3259 Wormholes问题,介绍了一种利用SPFA算法判断是否存在时间旅行负环的方法。通过实例展示了如何构建图模型,并给出了完整的C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

POJ3259 :Wormholes

时间限制:2000MS 内存限制:65536KByte 64位IO格式:%I64d & %I64u
描述

While exploring his many farms, Farmer John has discovered a number of amazing wormholes. A wormhole is very peculiar because it is a one-way path that delivers you to its destination at a time that is BEFORE you entered the wormhole! Each of FJ's farms comprises N (1 ≤ N ≤ 500) fields conveniently numbered 1..N, M (1 ≤ M ≤ 2500) paths, and W (1 ≤ W ≤ 200) wormholes.

As FJ is an avid time-traveling fan, he wants to do the following: start at some field, travel through some paths and wormholes, and return to the starting field a time before his initial departure. Perhaps he will be able to meet himself :) .

To help FJ find out whether this is possible or not, he will supply you with complete maps to F (1 ≤ F ≤ 5) of his farms. No paths will take longer than 10,000 seconds to travel and no wormhole can bring FJ back in time by more than 10,000 seconds.

输入
Line 1: A single integer, F. F farm descriptions follow.
Line 1 of each farm: Three space-separated integers respectively: N, M, and W
Lines 2..M+1 of each farm: Three space-separated numbers (S, E, T) that describe, respectively: a bidirectional path between S and E that requires T seconds to traverse. Two fields might be connected by more than one path.
Lines M+2..M+W+1 of each farm: Three space-separated numbers (S, E, T) that describe, respectively: A one way path from S to E that also moves the traveler back T seconds.
输出
Lines 1..F: For each farm, output "YES" if FJ can achieve his goal, otherwise output "NO" (do not include the quotes).
样例输入
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
提示
For farm 1, FJ cannot travel back in time.
For farm 2, FJ could travel back in time by the cycle 1->2->3->1, arriving back at his starting location 1 second before he leaves. He could start from anywhere on the cycle to accomplish this.
 
题意:

FJ的农场有很多虫洞,可以实现时光倒流,现在给你农场每条道路的起点、终点和时间,还有虫洞的起点、终点和能倒流的
时间,问FJ能不能通过时光倒流看到之前的自己。
首先T组数据,再输入n,m,w 分别代表n个节点,m个无向边的信息,w个有向虫洞的信息

思路:

把w个虫洞当负值加进边就行

比如第一组数据的3 1 3,在构图的时候add_edge(3,1,-3),即可。

其实就是用spfa跑一遍图,看一下有没有负环即可。有的话输出YES,没有的话输出NO

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#include<cmath>
#include<vector>
#include<cstring>
using namespace std;
typedef long long LL;
#define Max_N 1001
#define INF 100000000
int head[Max_N],vis[Max_N],n,In[Max_N],cnt;
int dis[Max_N];
int pa[Max_N];
struct note{
    int from,to,next;
    int c;
}edge[50005*2];
void init(){
    memset(head,-1,sizeof(head));
    cnt = 0;
}
void add_edge(int u,int v,double c){
    edge[cnt].from = u;
    edge[cnt].to = v;
    edge[cnt].c = c;
    edge[cnt].next = head[u];
    head[u] = cnt++;
}
bool spfa(int s,int n,int key){
    queue<int>q;
    for(int i = 0 ;i <= n ; i++)
        dis[i] = INF;
    memset(vis,0,sizeof(vis));
    memset(In,0,sizeof(In));
    q.push(s);
    vis[s] = 1;
    dis[s] = 0;
    if(key == -1)
        memset(pa,-1,sizeof(pa));
    while(!q.empty()){
        int p = q.front();
        vis[p] = 0;
        q.pop();
        for(int i = head[p] ; ~i ; i = edge[i].next){
            if(key==i)continue;
            int temp = edge[i].to;
            if(dis[temp] > dis[p] + edge[i].c){
                dis[temp] = dis[p] + edge[i].c;
                if(key==-1)
                     pa[temp] = i;
                if(!vis[temp]){
                    q.push(temp);
                    vis[temp] = 1;
                    if(++In[temp]>n)return false;
                }
            }
        }
    }
    return true;
}//spfa带记录路径,通过Key调整
int main(){
    int m,t,w;
    for(scanf("%d",&t);t--;){
        scanf("%d %d %d",&n,&m,&w);
        init();
        int x,y,c;
        for(int i = 0 ; i < m ; i++){
            scanf("%d %d %d",&x,&y,&c);
            add_edge(x,y,c);
            add_edge(y,x,c);
        }
        for(int i = 0 ; i < w ; i++){
            scanf("%d %d %d",&x,&y,&c);
            add_edge(x,y,-c);
        }
        spfa(1,n,-1)?puts("NO"):puts("YES");
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/Esquecer/p/8870348.html

资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在 IT 领域,文档格式转换是常见需求,尤其在处理多种文件类型时。本文将聚焦于利用 Java 技术栈,尤其是 Apache POI 和 iTextPDF 库,实现 doc、xls(涵盖 Excel 2003 及 Excel 2007+)以及 txt、图片等格式文件向 PDF 的转换,并实现在线浏览功能。 先从 Apache POI 说起,它是一个强大的 Java 库,专注于处理 Microsoft Office 格式文件,比如 doc 和 xls。Apache POI 提供了 HSSF 和 XSSF 两个 API,其中 HSSF 用于读写老版本的 BIFF8 格式(Excel 97-2003),XSSF 则针对新的 XML 格式(Excel 2007+)。这两个 API 均具备读取和写入工作表、单元格、公式、样式等功能。读取 Excel 文件时,可通过创建 HSSFWorkbook 或 XSSFWorkbook 对象来打开相应格式的文件,进而遍历工作簿中的每个 Sheet,获取行和列数据。写入 Excel 文件时,创建新的 Workbook 对象,添加 Sheet、Row 和 Cell,即可构建新 Excel 文件。 再看 iTextPDF,它是一个用于生成和修改 PDF 文档的 Java 库,拥有丰富的 API。创建 PDF 文档时,借助 Document 对象,可定义页面尺寸、边距等属性来定制 PDF 外观。添加内容方面,可使用 Paragraph、List、Table 等元素将文本、列表和表格加入 PDF,图片可通过 Image 类加载插入。iTextPDF 支持多种字体和样式,可设置文本颜色、大小、样式等。此外,iTextPDF 的 TextRenderer 类能将 HTML、
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值