虫洞
(写这篇只是想要留下我的注释)
题目描述
在一个神秘岛上,有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 晚