USACO 201 Jan. Gold

Farmer John 正在一个新的销售区域对他的牛奶销售方案进行调查。他想把牛奶送到 T 个城镇 ,编号为 1 到 T。这些城镇之间通过 R 条道路(编号为 1 到 R)和 P 条航线(编号为 1 到 P)连接。每条道路 i 或者航线 i 连接城镇 Ai​ 到 Bi​,花费为 Ci​。

对于道路,0 \le C_i \le 10^40≤Ci​≤104,然而航线的花费很神奇,花费 Ci​ 可能是负数。道路是双向的,可以从 Ai​ 到 Bi​,也可以从 Bi​ 到 Ai​,花费都是 Ci​。然而航线与之不同,只可以从 Ai​ 到 Bi​。

事实上,由于最近恐怖主义太嚣张,为了社会和谐,出台了一些政策保证:如果有一条航线可以从 Ai​ 到 Bi​,那么保证不可能通过一些道路和航线从 Bi​ 回到 Ai​。由于 FJ 的奶牛世界公认十分给力,他需要运送奶牛到每一个城镇。他想找到从发送中心城镇 SS 把奶牛送到每个城镇的最便宜的方案,或者知道这是不可能的。

输入格式
第一行为四个空格隔开的整数:T,R,P,S;

第二到第 R+1 行:三个空格隔开的整数(表示一条道路):Ai​,Bi​ 和 Ci​;

第 R+2 到 R+P+1 行:三个空格隔开的整数(表示一条航线):Ai​,Bi​ 和 Ci​。

输出格式
输出 T 行,第 i 行表示到达城镇 i 的最小花费,如果不存在输出 NO PATH。

样例
样例输入
6 3 3 4
1 2 5
3 4 5
5 6 10
3 5 -100
4 6 -100
1 3 -10
样例输出
NO PATH
NO PATH
5
0
-95
-100
样例说明
一共六个城镇。在 1 和 2,3 和 4,5 和 6 之间有道路,花费分别是 5,5,10。同时有三条航线:3→5,4→6 和 1→3,花费分别是 −100,−100,−10。FJ 的中心城镇在城镇 4。FJ 的奶牛从 4 号城镇开始,可以通过道路到达 3 号城镇。然后他们会通过航线达到 5 和 6 号城镇。但是不可能到达 1 和 2 号城镇。

数据范围与提示
对于全部数据,1≤T≤2.5×104,1≤R,P≤5×104,1≤Ai​,Bi​,S≤T。保证对于所有道路,0≤Ci​≤104,对于所有航线,−104≤Ci​≤104。

_______________________________________________________

有负边,明显SPFA。

超时,注意SPFA的优化。

_______________________________________________________

 1 #include<bits/stdc++.h>
2 using namespace std;
3 const int maxn=25010;
4 const int maxm=150010;
5 int n,r,p,s;
6 struct edge
7 {
8 int u,v,w,nxt;
9 }e[maxm];
10 int head[maxn],js;
11 void addage(int u,int v,int w)
12 {
13 e[++js].u=u;e[js].v=v;e[js].w=w;
14 e[js].nxt=head[u];head[u]=js;
15 }
16 int dis[maxn];
17 bool inq[maxn];
18 void spfa(int x)
19 {
20 memset(dis,0x3f,sizeof dis);
21 inq[x]=1;dis[x]=0;
22 deque<int>q;
23 q.push_front(x);
24 while(!q.empty())
25 {
26 int u=q.front();
27 q.pop_front();
28 inq[u]=0;
29 for(int i=head[u];i;i=e[i].nxt)
30 {
31 int v=e[i].v;
32 if(dis[v]>dis[u]+e[i].w)
33 {
34 dis[v]=dis[u]+e[i].w;
35 if(!inq[v])
36 {
37 if(q.empty() || dis[v]<dis[q.front()])q.push_front(v);
38 else q.push_back(v);
39 inq[v]=1;
40 }
41 }
42 }
43 }
44 }
45 inline int read(){
46 int ret=0;char ch=getchar();bool flg=0;
47 while(!isdigit(ch)) flg^=!(ch^'-'),ch=getchar();
48 while(isdigit(ch)) ret=(ret<<3)+(ret<<1)+ch-48,ch=getchar();
49 return flg?-ret:ret;
50 }
51 int main()
52 {
53 n=read();r=read();p=read();s=read();
54 for(int u,v,w,i=0;i<r;++i)
55 {
56 u=read();v=read();w=read();
57 addage(u,v,w);addage(v,u,w);
58 }
59 for(int u,v,w,i=0;i<p;++i)
60 {
61 u=read();v=read();w=read();
62 addage(u,v,w);
63 }
64 spfa(s);
65 for(int i=1;i<=n;++i)
66 if(dis[i]==0x3f3f3f3f)puts("NO PATH");
67 else printf("%d\n",dis[i]);
68 return 0;
69 }

LOJ10081的更多相关文章

随机推荐

  1. 关于django的坑(一)

    关于django orm 的坑: 关于设置数据库表自动更新 django的orm关于更新数据库的方法有update和save两种方法.想要表中自动更新需要一下几个条件: 使用 DateTimeFiel ...

  2. [LeetCode]80. Remove Duplicates from Sorted Array II删除数组中的重复值

    和第一题不同的地方是,容忍两次重复 虽然题目上说只需要长度,但是否检测的时候如果数组不跟着改变也是不行的 没说清楚题意 自己是用双指针做的,看了大神的答案更简单 public int removeDu ...

  3. 96. Unique Binary Search Trees1和2

    /* 这道题的关键是:动态表尽量的选取,知道二叉搜索树中左子树的点都比根节点小,右子树的点都比根节点大 所以当i为根节点,左子树有i-1个点,右子树有n-i个点,左右子树就可以开始递归构建,过程和一开 ...

  4. Eureka Server启动过程分析

    1.首先,SpringCloud充分利用了SpringBoot的自动装配特点 eureka-server的jar包,发现在META-INF下面的配置文件spring.factories,里面记录了Sp ...

  5. #3使用html+css+js制作网页 制作登录网页

    #3使用html+css+js制作网页 制作登录网页 本系列链接 2制作登录网页 2.1 准备 2.1.1 创建文件夹 2.1.2 创建主文件 2.2 html部分 2.2.1 网站信息 2.2.2 ...

  6. 关于.NET中的控制反转(三)- 依赖注入之 Autofac

    一.Autofac简介 Autofac和其他容器的不同之处是它和C#语言的结合非常紧密,在使用过程中对你的应用的侵入性几乎为零,更容易与第三方的组件集成.Autofac的主要特性如下: 组件侵入性为零 ...

  7. Mysql-Incorrect string value

    [问题描述] com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect string value: '\xF0\x9F\x8E\x8 ...

  8. vue 深度作用选择器

    使用 scoped 后,父组件的样式将不会渗透到子组件中 如果想在使用scoped,不污染全局的情况下,依然可以修改子组件样式,可以使用深度作用选择器 .tree{ width: 100%; floa ...

  9. version can neither be null, empty nor blank

    在用mybatis-generator逆向生成mapper和DAO的时候,出现了这个错误. mybatis-generator:generate 原因是在pom.xml中我的mysql依赖没有写版本号 ...

  10. 【Tomcat 源码系列】认识 Tomcat

    一,前言 说一句大实话,"平时一直在用 Tomcat,但是我从来没有用过 Tomcat". "平时一直在用 Tomcat",是因为搬砖用的 SpringBoot ...