虫洞

虫洞

(写这篇只是想要留下我的注释)

题目描述
在一个神秘岛上,有N(1 <= N <= 500)个洞口,标号1…N,它们之间有M (1 <= M <= 2500) 条通道相连。

神秘的竟然另外还有W (1 <= W <=200)条传说中的时间虫洞----当到达通道的另一端洞口时,竟然可以比进入的时间要早!

你当然想进行这样的时间之旅,希望从一个洞口s出发,经过几个通道,在比出发早些时候的时间回到洞口s。也许还能碰到自己呢,hehe 根据给定的地图,请判断能否实现这样的愿望。

给定图为连通图。

输入格式
第一行:一个整数 F (1 <= F <= 5),表示共有F组数据。(多组数据测试)

每组数据: 第1行:三个整数 N M W

第2至M+1行:每行三个整数 (S, E, T),表示在S与E洞口之间有一个双向通道,通过需要T(0 <= T <= 10,000) 秒。

第M+2至M+W+1行:每行三个整数 (S, E, T),表示在S与E洞口之间有一个单向通道,从S到E可以回到之前T(0 <= T <= 10,000) 秒。

输出格式
共1…F行,每行对应一组数据,如果可以实现愿望输出"YES",否则输出"NO".

样例数据

input

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

output

NO
YES

数据规模与约定

usaco wormhole

时间限制:1s1s
空间限制:256MB256MB

emmm,我注释写的很完整

/*原来这道题求有没有负环就可以了。。。。题目搞那么麻烦存心让我看不懂是不是`へ′*/ 
/*瞄了一圈发现居然都木有注释(看不懂哇),那我自己写一个注释最全版*/ 
#include<bits/stdc++.h> 
using namespace std;  
int F; //几组测试数据 
int N,M,W; //几个点 几条双向边 几条单向边 
int dis[5000]={}; //存点到初始点的位置  
bool rel=0; //有几次松弛
struct hello_world //边表 
{ 
	int X,Y; //起点和终点 
	int V; //权值 
}a[3000000]; //边表就是单纯的记录所有边的信息  
int tmp=0; //第几条边了? 
int main() 
{ 
//	freopen("wormhole.in","r",stdin); 
//	freopen("wormhole.out","w",stdout); 
	cin>>F;
	for(int i=1;i<=F;i++) //后面是一个叫做 BEllman-ford 的算法 
	{
		cin>>N>>M>>W; 
		tmp=0; //循环重新开始要清空 
		memset(a,0,sizeof(a)); //a要清空哦 
		memset(dis,10,sizeof(dis)); //初始化每点到初始点最大距离为无穷大   
		for(int i=1;i<=M;i++) //存入双向边 
		{
			int x,y,v; 
			cin>>x>>y>>v; 
			tmp++; //加一条边 
			a[tmp].X=x; //存入起点  
			a[tmp].Y=y; //存入终点 
			a[tmp].V=v; //存入边权 
			tmp++; //再加一条边,反着来一次  
			a[tmp].X=y; //存入起点 
			a[tmp].Y=x; //存入终点 
			a[tmp].V=v; //存入边权 
		} 
		for(int i=1;i<=W;i++) //存入单向边   
		{ 
			int x,y,v; 
			cin>>x>>y>>v; 
			tmp++; //加一条边 
			a[tmp].X=x; //存入起点  
			a[tmp].Y=y; //存入终点 
			a[tmp].V=-v; //存入边权 时间倒流,边权为负 
		} 
		/*以上是输入*/
		for(int i=1;i<=N;i++)
		{
			rel=0; //先是无松弛 
			for(int j=1;j<=tmp;j++) //取图的每一条边(一个 tmp 条) 
			{
				if(dis[a[j].X]+a[j].V<dis[a[j].Y]) //判断是否能松弛 
				{
					dis[a[j].Y]=dis[a[j].X]+a[j].V; //进行松弛 
					rel=1; //发生了松弛的标记 
				} 
			} 
			if(!rel) 
			{
				cout<<"NO"<<endl; //没有松弛了,说明没有负环 
				break; 
			} 
		} 
		if(rel) cout<<"YES"<<endl; //迭代了 n 次还可以松弛,说明有负环 
	} 
	return 0; //完美结束 
} 

完美啊,然而我提交了好几次

其中又一次提交忘记去 //
第一次交的代码错误有:
1、是输出“YES”之后忘记换行了
2、是“YES”和“NO” 没有大写
3、数组爆了(改过一次后还是爆了,压根就没发现那里爆了)

因为边有双向边,所以 a数组不能只开这点大!

2019.4.9 晚

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
bugstack栈是一个以技术为核心的社群和知识分享平台。在这个平台上,程序员、软件开发者和技术爱好者可以交流、学习和分享各种与技术相关的话题和经验。 首先,bugstack栈提供了丰富多样的技术资源。在这个平台上,用户可以找到各种编程语言、开发框架和技术工具的教程、文档和案例。这些资源涵盖了从初级到高级的各个层次,无论你是刚入门的新手还是资深的专家,都可以在这里找到适合自己的学习材料。 其次,bugstack栈注重用户之间的交流和互动。用户可以在平台上发表自己的观点、经验和问题,与其他人进行讨论和互动。这种交流不仅可以加深自己对技术的理解和掌握,还可以结交到更多志同道合的朋友和同行,激发创新思维和解决问题的能力。 此外,bugstack栈还举办各种线上线下的技术活动。比如技术讲座、技术沙龙、技术峰会等。这些活动不仅给用户提供了进一步学习和分享的机会,还可以拓宽用户的视野,了解更多前沿的技术和行业趋势。 总之,bugstack栈是一个面向技术爱好者的社群平台,它提供了丰富多样的技术资源,注重用户之间的交流和互动,举办各种技术活动,为用户提供一个学习、交流和成长的平台。无论你是想学习新技术、解决问题,还是寻找合作伙伴或者拓展人脉,这个平台都是一个理想的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值