1715: [Usaco2006 Dec]Wormholes 虫洞

Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 501  Solved: 278
[Submit][Status][Discuss]

Description

John在他的农场中闲逛时发现了许多虫洞。虫洞可以看作一条十分奇特的有向边,并可以使你返回到过去的一个时刻(相对你进入虫洞之前)。John的每个农场有M条小路(无向边)连接着N (从1..N标号)块地,并有W个虫洞。其中1<=N<=500,1<=M<=2500,1<=W<=200。 现在John想借助这些虫洞来回到过去(出发时刻之前),请你告诉他能办到吗。 John将向你提供F(1<=F<=5)个农场的地图。没有小路会耗费你超过10000秒的时间,当然也没有虫洞回帮你回到超过10000秒以前。

Input

* Line 1: 一个整数 F, 表示农场个数。

* Line 1 of each farm: 三个整数 N, M, W。

* Lines 2..M+1 of each farm: 三个数(S, E, T)。表示在标号为S的地与标号为E的地中间有一条用时T秒的小路。

* Lines M+2..M+W+1 of each farm: 三个数(S, E, T)。表示在标号为S的地与标号为E的地中间有一条可以使John到达T秒前的虫洞。

Output

* Lines 1..F: 如果John能在这个农场实现他的目标,输出"YES",否则输出"NO"。

Sample 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

Sample Output

NO
YES

HINT

 

Source

Gold

题解:很明显是找负权回路,可是我还一直没写过,直到今天第一次写spfa找负权回路——bfs的spfa只要判断下每个节点的入队次数,只要大于N,就可以判断有负环

 /**************************************************************
Problem:
User: HansBug
Language: Pascal
Result: Accepted
Time: ms
Memory: kb
****************************************************************/ type
point=^node;
node=record
g,w:longint;
next:point;
end;
var
i,j,k,l,m,n,t:longint;
a:array[..] of point;
b,c,g,e:array[..] of longint;
d:array[..] of longint;
procedure add(x,y,z:longint);
var p:point;
begin
new(p);p^.g:=y;p^.w:=z;p^.next:=a[x];a[x]:=p;
end; function spfa(x:longint):boolean;
var f,r:longint;p:point;
begin
fillchar(e,sizeof(e),);
fillchar(b,sizeof(b),);
fillchar(g,sizeof(g),);
for i:= to n do c[i]:=maxlongint div ;
f:=;r:=;g[x]:=;d[]:=x;c[x]:=;b[x]:=;e[x]:=;
while f<>r do
begin
p:=a[d[f]];
while p<>nil do
begin
if (e[p^.g]=) or (c[p^.g]>(c[d[f]]+p^.w)) then
begin
e[p^.g]:=;
c[p^.g]:=c[d[f]]+p^.w;
if g[p^.g]= then
begin
inc(b[p^.g]);
if b[p^.g]>n then exit(true);
g[p^.g]:=;
d[r]:=p^.g;
r:=r mod +;
end;
end;
p:=p^.next;
end;
g[d[f]]:=;f:=f mod +;
end;
exit(false);
end;
begin
readln(t);
while not(eof) do
begin
readln(n,m,t);
for i:= to n do a[i]:=nil;
for i:= to m do
begin
readln(j,k,l);
add(j,k,l);add(k,j,l);
end;
for i:= to t do
begin
readln(j,k,l);
add(j,k,-l);
end;
if spfa() then writeln('YES') else writeln('NO');
end;
end.

最新文章

  1. Oracle 常用修改字段SQL语句
  2. jQuery学习之jQuery Ajax用法详解
  3. 解决eclipse报PermGen space内存溢出异常的问题
  4. Windows下虚拟机安装Mac OS X ----- VM12安装Mac OS X 10.11
  5. QGIS
  6. CentOS7 下使用YUM安装 MySQL5.7
  7. MySQL创建带有编码的数据库
  8. Libgdx 1.6.1发布,跨平台游戏开发框架
  9. C#中用ILMerge合并DLL和exe文件成一个exe文件或者DLL
  10. 活代码LINQ——09
  11. SpringBoot笔记十三:引入webjar资源和国际化处理
  12. react项目的ant-design-mobile的使用
  13. org.apache.httpcomponents httpclient 发起HTTP JSON请求
  14. IDEA中Git的使用基础
  15. html to openxml
  16. C语言程序设计I—第七周教学
  17. 关于自动AC机
  18. SSMS安装英文版后无法修改为中文
  19. Mybatis简单入门
  20. jquery next()方法

热门文章

  1. Java学习之旅基础知识篇:数组及引用类型内存分配
  2. [TPYBoard-Micropython教程之1] 运行第一个脚本——点亮LED
  3. python中关于发邮件的示例
  4. Recurrent Neural Network系列3--理解RNN的BPTT算法和梯度消失
  5. js精要之构造函数
  6. 蓝桥网试题 java 基础练习 查找整数
  7. 深入浅出ThreadLocal
  8. (@WhiteTaken)设计模式学习——原型模式
  9. Git学习之路(6)- 分支操作
  10. dev简单实现柱状图,曲线图