P1821 [USACO07FEB]银牛派对Silver Cow Party

题目描述

One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to attend the big cow party to be held at farm #X (1 ≤ X ≤ N). A total of M (1 ≤ M ≤ 100,000) unidirectional (one-way roads connects pairs of farms; road i requires Ti (1 ≤ Ti ≤ 100) units of time to traverse.

Each cow must walk to the party and, when the party is over, return to her farm. Each cow is lazy and thus picks an optimal route with the shortest time. A cow's return route might be different from her original route to the party since roads are one-way.

Of all the cows, what is the longest amount of time a cow must spend walking to the party and back?

寒假到了,N头牛都要去参加一场在编号为X(1≤X≤N)的牛的农场举行的派对(1≤N≤1000),农场之间有M(1≤M≤100000)条有向路,每条路长Ti(1≤Ti≤100)。

每头牛参加完派对后都必须回家,无论是去参加派对还是回家,每头牛都会选择最短路径,求这N头牛的最短路径(一个来回)中最长的一条路径长度。

输入格式

第一行三个整数N,M, X;

第二行到第M+1行:每行有三个整数Ai,Bi, Ti ,表示有一条从Ai农场到Bi农场的道路,长度为Ti。

输出格式

一个整数,表示最长的最短路得长度。

输入输出样例

输入 #1

4 8 2

1 2 4

1 3 2

1 4 7

2 1 1

2 3 5

3 1 2

3 4 4

4 2 3

输出 #1

10

说明/提示

SPFA

【注意注意】

这是单向路单向路单向路!!!

重要的事情说三遍!!!

(题目中没点出这点但是我的全WA经历让我深刻的认识到了这一点)

【思路】

去和来这是两个完全相反的东西

SPFA跑一个方向是很轻松的

然后另一个方向就很难办了

该怎么办呢?

n遍SPFA?

不太可能这就是一道黄题

对了!可以反向建图!

将方向反过来建出来的图就是完全相反的

某个点到x的距离恰好就是回家的最短距离

这样和正向建图一结合

就能求出去和回的最短路径了

然后比较最大的和

输出就好了

【完整代码】

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int Max = 100005;
struct node
{
int y;
int ne;
int z;
}a1[Max << 1],a2[Max << 1];
int n,m,x;
const int M = 1002;
int head1[M],head2[M];
int sum = 0;
void add1(int x,int y,int z)
{
a1[++ sum].y = y;
a1[sum].z = z;
a1[sum].ne = head1[x];
head1[x] = sum;
}
void add2(int x,int y,int z)
{
a2[++ sum].y = y;
a2[sum].z = z;
a2[sum].ne = head2[x];
head2[x] = sum;
} int d1[M],d2[M];
bool use[M];
void SPFA1()
{
memset(use,false,sizeof(use));
queue<int>q;
for(register int i = 1;i <= n;++ i)
d1[i] = 999999;
d1[x] = 0;
q.push(x);
while(!q.empty())
{
int qwq = q.front();
q.pop();use[qwq] = false;
for(register int i = head1[qwq];i != 0;i = a1[i].ne)
{
int awa = a1[i].y;
if(d1[awa] > d1[qwq] + a1[i].z)
{
d1[awa] = d1[qwq] + a1[i].z;
if(use[awa] == false)
{
use[awa] = true;
q.push(awa);
}
}
}
}
}
void SPFA2()
{
memset(use,false,sizeof(use));
queue<int>q;
for(register int i = 1;i <= n;++ i)
d2[i] = 999999;
d2[x] = 0;
q.push(x);
while(!q.empty())
{
int qwq = q.front();
q.pop();use[qwq] = false;
for(register int i = head2[qwq];i != 0;i = a2[i].ne)
{
int awa = a2[i].y;
if(d2[awa] > d2[qwq] + a2[i].z)
{
d2[awa] = d2[qwq] + a2[i].z;
if(use[awa] == false)
{
use[awa] = true;
q.push(awa);
}
}
}
}
} int main()
{
scanf("%d%d%d",&n,&m,&x);
int xx,yy,zz;
for(register int i = 1;i <= m;++ i)
{
scanf("%d%d%d",&xx,&yy,&zz);
add1(xx,yy,zz);
add2(yy,xx,zz);
}
SPFA1();
SPFA2();
int MM = 0;
for(register int i = 1;i <= n;++ i)
MM = max(MM,d1[i] + d2[i]);
cout << MM << endl;
return 0;
}

洛谷 P1821 [USACO07FEB]银牛派对Silver Cow Party 题解的更多相关文章

  1. 洛谷——P1821 [USACO07FEB]银牛派对Silver Cow Party

    P1821 [USACO07FEB]银牛派对Silver Cow Party 题目描述 One cow from each of N farms (1 ≤ N ≤ 1000) conveniently ...

  2. 洛谷P1821 [USACO07FEB]银牛派对Silver Cow Party

    题目描述 One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to attend the b ...

  3. 洛谷 P1821 [USACO07FEB]银牛派对Silver Cow Party

    银牛派对 正向建图+反向建图, 两边跑dijkstra,然后将结果相加即可. 反向建图以及双向建图的做法是学习图论的必备思想. #include <iostream> #include & ...

  4. 洛谷 1821 [USACO07FEB]银牛派对Silver Cow Party

    [题解] 其实解法 #include<cstdio> #include<cstring> #include<algorithm> #define LL long l ...

  5. P1821 [USACO07FEB]银牛派对Silver Cow Party

    题目描述 One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to attend the b ...

  6. luogu P1821 [USACO07FEB]银牛派对Silver Cow Party

    题目描述 One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to attend the b ...

  7. 【luogu P1821 [USACO07FEB]银牛派对Silver Cow Party】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1821 反向多存一个图,暴力跑两遍 #include <cstdio> #include < ...

  8. [USACO07FEB]银牛派对Silver Cow Party

    题目简叙: 寒假到了,N头牛都要去参加一场在编号为X(1≤X≤N)的牛的农场举行的派对(1≤N≤1000),农场之间有M(1≤M≤100000)条有向路,每条路长Ti(1≤Ti≤100). 每头牛参加 ...

  9. 「Luogu 1821」[USACO07FEB]银牛派对Silver Cow Party

    更好的阅读体验 Portal Portal1: Luogu Portal2: POJ Description One cow from each of N farms \((1 \le N \le 1 ...

随机推荐

  1. mysql 删除表中多余的重复记录

    =============================================== 2019/7/16_第1次修改                       ccb_warlock == ...

  2. 怎样遍历NodeList对象

    因为NodeList对象是一个类似数组的对象, 且它自带了一个 forEach() 方法, 因此可以使用 forEach() 遍历, 它的用法和 Array 里面的 forEach() 是完全一样的. ...

  3. C#/.NET 中启动进程时所使用的 UseShellExecute 设置为 true 和 false 分别代表什么意思?

    原文:C#/.NET 中启动进程时所使用的 UseShellExecute 设置为 true 和 false 分别代表什么意思? 在 .NET 中创建进程时,可以传入 ProcessStartInfo ...

  4. 静态工具类注入service的方法

    http://blog.sina.com.cn/s/blog_6e2d53050102wl3x.html

  5. tf.reduce_mean函数用法及有趣区别

    sess=tf.Session() a=np.array([1,2,3,5.]) # 此代码保留为浮点数 a1=np.array([1,2,3,5]) # 此代码保留为整数 c=tf.reduce_m ...

  6. 文件包含漏洞File Inclusion

    文件包含漏洞 目录遍历漏洞在国内外有许多不同的叫法,也可以叫做信息泄露漏洞.非授权文件包含漏洞等. 文件包含分类 LFI:本地文件包含(Local File Inclusion) RFI:远程文件包含 ...

  7. linux上安装redis-单机版

    1. Redis的安装 1.1. Redis的安装 Redis是c语言开发的. 安装redis需要c语言的编译环境.如果没有gcc需要在线安装.yum install gcc-c++ 安装步骤: 第一 ...

  8. 【故障解决】enq: PS - contention

    [故障解决]enq: PS - contention 一.1  BLOG文档结构图       一.2  前言部分   一.2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能, ...

  9. MySQL/MariaDB数据库的半同步复制

      MySQL/MariaDB数据库的半同步复制 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL半同步复制概述 1>.MySQL默认的异步复制 默认情况下,M ...

  10. web程序防止攻击的一些资料——整理

    地址:https://docs.microsoft.com/en-us/previous-versions/aspnet/a2a4yykt(v=vs.100)?redirectedfrom=MSDN ...