当前位置: 首页 > 编程日记 > 正文

【POJ】3268 Silver Cow Party (将有向图的边反转)

问题链接:http://poj.org/problem?id=3268

【问题描述】

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?

【输入描述】

Line 1: Three space-separated integers, respectively: N, M, and X

Lines 2… M+1: Line i+1 describes road i with three space-separated integers: Ai, Bi, and Ti. The described road runs from farm Ai to farm Bi, requiring Ti time units to traverse.

【输出描述】

Line 1: One integer: the maximum of time any one cow must walk.

【样例输入】

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

【样例输出】

10

注意:
题不止求一个点的最短路,

  1. 一个是从牛X的位置返回它们各自的位置的最短距离,我写的是xa函数,这个就是简单的Dijkstra算法的应用
  2. 牛从它们自己的点去牛x的位置,这个有两种方法
    • 以每一个点为起点计算从该点到x的最短距离,如果数据量太大的,就会超时。
    • 将有向边反转,这个和乘以2是不一样的概念,因为图都已经不一样了,可以这么想,在1的情况下,从x返回,现在要从各个顶点去x,那样的路径是不是相当于把边反转以后再从x回来是一样的,把边反转以后,有向图就变了,所以和乘以2不一样。
#include <iostream>
#include <queue>
#include <vector>
#include <cstdio>
#include <algorithm>using namespace std;const int maxn = 1005;
const int inf = 0x3f3f3f3f;struct node
{int to;int cost;node(int t,int c){to = t;cost = c; }friend bool operator < (struct node a,struct node b){return a.cost > b.cost;}
};int d1[maxn];
int d2[maxn];
int vis[maxn];
vector<node> v1[maxn];//从x返回 
vector<node> v2[maxn];//去x,将边的反转,即也是从x来求 
int n,m,x;void xa()//从x返回 
{fill(vis,vis+maxn,0);fill(d1,d1+maxn,inf);priority_queue<node> p;d1[x] = 0;p.push(node(x,0));while(p.empty()!=1){node t = p.top();p.pop();int pos = t.to;if(vis[pos])continue;vis[pos] = 1;for(int i=0;i<v1[pos].size();i++){node x = v1[pos][i];if(!vis[x.to] && d1[x.to]>(d1[pos]+x.cost)){d1[x.to] = d1[pos] + x.cost;p.push(node(x.to,d1[x.to]));}}}
}void ax()//将边反转 
{fill(vis,vis+maxn,0);fill(d2,d2+maxn,inf);priority_queue<node> p;d2[x] = 0;p.push(node(x,0));while(p.empty()!=1){node t = p.top();p.pop();int pos = t.to;if(vis[pos])continue;vis[pos] = 1;for(int i=0;i<v2[pos].size();i++){node x = v2[pos][i];if(!vis[x.to] && d2[x.to]>d2[pos]+x.cost){d2[x.to] = d2[pos] + x.cost;p.push(node(x.to,d2[x.to])); }}}
} int main ()
{int i,a,b,c;while(scanf("%d%d%d",&n,&m,&x)!=EOF){for(i=0;i<n;i++){d1[i] = inf;d2[i] = inf;v1[i].clear();v2[i].clear();} for(i=0;i<m;i++){scanf("%d%d%d",&a,&b,&c);v1[a].push_back(node(b,c));//去的边 v2[b].push_back(node(a,c));//边的反转 }xa();ax();int ans = -1;for(i=1;i<=n;i++){ans = max(ans,d1[i]+d2[i]);}printf("%d\n",ans);}return 0;
} 

下面的代码是没有将边反转,而是以每一个点为起点,计算到x的最短路

#include <iostream>
#include <queue>
#include <vector>
#include <cstdio>
#include <algorithm>using namespace std;const int maxn = 1005;
const int inf = 0x3f3f3f3f;struct node
{int to;int cost;node(int t,int c){to = t;cost = c; }friend bool operator < (struct node a,struct node b){return a.cost > b.cost;}
};int d1[maxn];
int dd[maxn];
int vis[maxn];
vector<node> v1[maxn];//从x返回 
int n,m,x;void xa()//从x返回 
{fill(vis,vis+maxn,0);fill(d1,d1+maxn,inf);priority_queue<node> p;d1[x] = 0;p.push(node(x,0));while(p.empty()!=1){node t = p.top();p.pop();int pos = t.to;if(vis[pos])continue;vis[pos] = 1;for(int i=0;i<v1[pos].size();i++){node x = v1[pos][i];if(!vis[x.to] && d1[x.to]>(d1[pos]+x.cost)){d1[x.to] = d1[pos] + x.cost;p.push(node(x.to,d1[x.to]));}}}
}int ax(int tem)
{int d2[maxn];fill(vis,vis+maxn,0);fill(d2,d2+maxn,inf);priority_queue<node> p;d2[tem] = 0;p.push(node(tem,0));while(p.empty()!=1){node t = p.top();p.pop();int pos = t.to;if(vis[pos])continue;if(pos==x)return d2[x];vis[pos] = 1;for(int i=0;i<v1[pos].size();i++){node x = v1[pos][i];if(!vis[x.to] && d2[x.to]>d2[pos]+x.cost){d2[x.to] = d2[pos] + x.cost;p.push(node(x.to,d2[x.to])); }}}return d2[x];
} int main ()
{int i,a,b,c;while(scanf("%d%d%d",&n,&m,&x)!=EOF){for(i=0;i<n;i++){d1[i] = inf;v1[i].clear();} for(i=0;i<m;i++){scanf("%d%d%d",&a,&b,&c);v1[a].push_back(node(b,c));//去的边 }xa();for(i=1;i<=n;i++){if(i==x)continue;dd[i] = ax(i);}int ans = -1;for(i=1;i<=n;i++){ans = max(ans,d1[i]+dd[i]);}printf("%d\n",ans);}return 0;
} 

相关文章:

项目管理深入理解08--成本管理

成本管理一章非常的重要&#xff0c;尤其是对于程序员来说&#xff0c;这方面非常的薄弱&#xff0c;但这部分知识无论是在项目管理中还是日常生活中都灰常重要&#xff0c;不然很难成为一个财务自由的程序员。此外&#xff0c;由于财务方面知识点比较多&#xff0c;特增加经济…

python数据结构与算法:双向链表

双向链表&#xff1a; ###################### P4.13-P4. 双向链表 ########################### # import singlelinkListclass Node(object):def __init__(self,item):self.elem itemself.next Noneself.prev None# class DoublelinkList(singlelinkList): #继承 class …

如何开发一个区块链应用程序

区块链是一项巧妙的发明&#xff0c;有望使数字世界更加安全和分散。通过允许数字信息的分发而不是复制&#xff0c;区块链技术创建了一种新型互联网。最初是为数字货币比特币而设计的&#xff0c;现在科技界正在寻找该技术的其他潜在用途。在不久的将来&#xff0c;我们将看到…

python数据结构与算法:栈

栈&#xff1a; Stack() 创建一个新的空栈 push(item) 添加一个新的元素item到栈顶 pop() 弹出栈顶元素 peek() 返回栈顶元素 is_empty() 判断栈是否为空 size() 返回栈的元素个数 Stack() 创建一个新的空栈 push(item) 添加一个新的元素item到栈顶 pop() 弹出栈顶元素 peek(…

【PAT (Basic Level) 】1014 福尔摩斯的约会 (20 分)

大侦探福尔摩斯接到一张奇怪的字条&#xff1a; 我们约会吧&#xff01; 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm大侦探很快就明白了&#xff0c;字条上奇怪的乱码实际上就是约会的时间星期四 14:04&#xff0c;因为前面两字符串中第 1 对相同的…

菜鸟物流云是如何帮助快递合作伙伴解决双11巨大业务负荷的?

物流云双11 双11前&#xff0c;菜鸟物流云共接入12家合作伙伴&#xff0c;全部参加双11大促活动&#xff0c;作为物流云的首次双11&#xff0c;尤其是经过了快递公司的大考经验&#xff0c;事实证明项目是靠谱的。 双11前已经整体上云的快递合作伙伴2家&#xff0c;韵达和天天&…

安装H3C的各种问题

HCL安装完成后&#xff0c;启动HCL失败&#xff1b;提示&#xff1a;“当前系统用户名中包含非ASCII字符”问题&#xff1f;HCL只能安装装在英文路径下&#xff0c;如果用户名为中文或者安装路径有中文目录&#xff0c;就会出现此问题&#xff0c;请确保系统用户名和安装路径中…

前景背景分割——ostu算法的原理及实现 OpenCV (八)

OpenCV 【八】——前景背景分割——ostu算法的原理及实现 实验结果代码实现实现原理参考资料实验结果 代码实现 #include<opencv2/opencv.hpp> #include<iostream> using namespace std; using namespace cv; //计算图像灰度直方图 Mat calcgrayhist(const Mat&am…

【PAT (Basic Level) 】1015 德才论 (25 分)

宋代史学家司马光在《资治通鉴》中有一段著名的“德才论”&#xff1a;“是故才德全尽谓之圣人&#xff0c;才德兼亡谓之愚人&#xff0c;德胜才谓之君子&#xff0c;才胜德谓之小人。凡取人之术&#xff0c;苟不得圣人&#xff0c;君子而与之&#xff0c;与其得小人&#xff0…

浏览器启动外部软件

常可以看见使用浏览器代码启动本地应用的软件.例如qq、迅雷、等等.那么他们是怎么做到的呢? 它的奥秘:Register protocol 前言我们经常看到 tencent://..thunder://这两种开头的网址&#xff0c;往往觉得很奇怪&#xff0c;很想弄懂其中的原理&#xff0c;是如何实现的&#x…

Luogu P1082 同余方程(NOIP 2012) 题解报告

题目传送门 【题目大意】 求关于x的同余方程 ax≡1(mod b)的最小整数解。 【思路分析】 由同余方程的有关知识可得&#xff0c;ax≡1(mod b)可以化为axby1&#xff0c;此方程有解当且仅当gcd(a,b)1&#xff0c;于是就可以用欧几里得算法求出一组特解x0&#xff0c;y0。 那么x0就…

MATLAB【二】————图像做减法,批量文本处理,子图显示

clear; clc; close all;name_string ["1.5ms\100\" ];length strlength(name_string); [m,n] size(length);%%----------------------------- for num1:mstr name_string(num,1); figure(color, [1, 1, 1], position, [0, 0, 1800,800]); % 为区分边界&a…

与数据有关的问题

&#xfeff;&#xfeff;◆ 背景说明 在为用户排查问题&#xff0c;解决问题时&#xff0c;有一种情况是不容易引起大家注意的&#xff0c;那就是用户的数据&#xff1b;比如&#xff0c;数据中有某些特殊字符&#xff0c;引起展现不了或展现不正常&#xff1b;现在&#xff…

【PAT (Basic Level) 】1024 科学计数法 (20 分)

科学计数法是科学家用来表示很大或很小的数字的一种方便的方法&#xff0c;其满足正则表达式 [][1-9].[0-9]E[][0-9]&#xff0c;即数字的整数部分只有 1 位&#xff0c;小数部分至少有 1 位&#xff0c;该数字及其指数部分的正负号即使对正数也必定明确给出。 现以科学计数法…

jsp 实栗 jsp + jdbc 登录

jsp 实栗 jsp jdbc 实现登录 实现思路 一个表单页&#xff0c;输入用户登录和密码&#xff0c;然后信息提交到jsp页面进行验证&#xff0c;如果可以服务器跳转到登录成功页&#xff0c;失败&#xff0c;跳转到错误页 跳转的时候窗口的URL地址会发生变化 代码如下 编写登录代码…

OpenCV 【十】——Gamma校正 ——图像灰度变化

Gamma校正&#xff08;C、OpenCV实现&#xff09; 1.作用&#xff1a; Gamma校正是对输入图像灰度值进行的非线性操作&#xff0c;使输出图像灰度值与输入图像灰度值呈指数关系&#xff1a; 伽玛校正由以下幂律表达式定义&#xff1a; 2.函数原型 void calcHist( const Mat*…

Linux磁盘阵列技术详解(二)--raid 1创建

我在Linux磁盘阵列技术详解&#xff08;一&#xff09;里已经详细介绍了几种RAID磁盘阵列方式&#xff0c;原理以及创建raid 0 的详细步骤。那么这篇文档就着重讲解如何创建raid 1的技术&#xff1a;步骤如下&#xff1a;① 分区同样我们还是以一块硬盘的不同分区为例&#xff…

【PAT (Basic Level) 】1025 反转链表 (25 分)

给定一个常数 K 以及一个单链表 L&#xff0c;请编写程序将 L 中每 K 个结点反转。例如&#xff1a;给定 L 为 1→2→3→4→5→6&#xff0c;K 为 3&#xff0c;则输出应该为 3→2→1→6→5→4&#xff1b;如果 K 为 4&#xff0c;则输出应该为 4→3→2→1→5→6&#xff0c;即…

C#关于窗体的传值

关于窗体之间的传值我在《编程技巧与维护》杂志上写过总结文章&#xff0c;比较久远了。 开始的时候&#xff0c;用下面的方法传递&#xff0c;程序运行正常。 Form1 f1 this.Owner as Form1; //Form1 f1 (Form1)this.Owner;&#xff08;这样写也可以&#xff09; …

MATLAB【四】 ————批量适配图片信息与excel/txt等文档信息,批量移动拷贝图片,批量存图片中点和方框

1、批量读取图片&#xff0c;批量读取文件 2、适配文件与excel、txt等文档信息 3、获取显示图片ROI、Point、rect、更改像素值 4、批量移动拷贝图片&#xff0c;批量显示 5、保存显示图片或者图片中的点和方框。 clear; clc; close all;%% crop the im into 256*256 num 0…

mysql日志文件相关的配置【2】

1、二进制日志是什么&#xff1f; mysql 的二进制日志用于记录数据库上做的变更、 2、二进制日志什么时间写到磁盘 1、总的来说二进制日志会在释放锁之前就写入磁盘、也就是说在commit完成之前&#xff1b;client还没发送commit这个时候mysql并不把binlog写入磁盘、 别一方面my…

【PAT (Basic Level) 】1028 人口普查 (20 分)

某城镇进行人口普查&#xff0c;得到了全体居民的生日。现请你写个程序&#xff0c;找出镇上最年长和最年轻的人。这里确保每个输入的日期都是合法的&#xff0c;但不一定是合理的——假设已知镇上没有超过 200 岁的老人&#xff0c;而今天是 2014 年 9 月 6 日&#xff0c;所以…

SW6206超级华为快充5V5A,全协议OPPO闪充、自带电量计量、LED 灯/数码管显示

深圳市展嵘电子有限公司有需要的上帝可联系小陈&#xff1a;136-6225-3950 : 3412-1522-98SW6206 是一款高集成度的多协议双向快充移动电源专用多合一芯片&#xff0c;支持AABCL 口任意口快充。其集成了5A高效率开关充电&#xff0c;20W高效率同步升压输出&#xff0c;PPS/PD/Q…

bash脚本【一】——批量处理文件

Bash脚本2.0 #!/bin/bashoutput_root_dir"0723weixin" data_root_dir"D:/data/"$output_root_dir config_dir"config"# speckle_name"SPEACKLEIMAGE.bmp" # ir_name"IRIMAGE.bmp" # rgb_name"RGBIMAGE.jpg" # co…

【PAT (Basic Level) 】1030 完美数列 (25 分)

给定一个正整数数列&#xff0c;和正整数 p&#xff0c;设这个数列中的最大值是 M&#xff0c;最小值是 m&#xff0c;如果 M≤mp&#xff0c;则称这个数列是完美数列。 现在给定参数 p 和一些正整数&#xff0c;请你从中选择尽可能多的数构成一个完美数列。 【输入格式】&…

运营商劫持处理

测试URL&#xff1a;因近期发现长宽资源经常出现被劫持和转发错误的现象。解决办法如下&#xff1a;1、把转发列表写到named.conf文件里&#xff0c;更新我们的转发ip2、然后编写策略针对我们要去的域名从BGP出口出去&#xff0c;防止NAT。x.x.x.x.com&#xff0c;&#xff08;…

oracle维护数据的完整性

转自&#xff1a;https://www.cnblogs.com/roger112/p/7722376.html 介绍&#xff1a; 数据的完整性用于确保数据库数据遵从一定的商业的逻辑规则。在oracle中&#xff0c;数据完整性可以使用约束、触发器、应用程序(过程、函数)三种方法来实现&#xff0c;在这三种方法中&…

MATLAB【五】———— matlab 调用C++生成exe文件,高斯核函数

两种方式调用C生成的exe文件&#xff0c; 语法&#xff1a; status system(command) [status,cmdout] system(command) [status,cmdout] system(command,-echo) 说明 status system(command) 调用操作系统执行指定的命令。操作会等待命令执行完毕&#xff0c;然后再将命令…

REACT day 1

https://facebook.github.io/react/ A JAVASCRIPT LIBRARY FOR BUILDING USER INTERFACES Declarative views make your code more predictable and easier to debug. React是Facebook在2013年发布的一个前端框架&#xff0c;而如今的React俨然已经演变成一个前端生态&#xff…

win10+Chrome浏览器截长图方法

本方法亲测可行&#xff0c;操作系统为win10&#xff0c;其他操作系统没有试过。 部分内容基于https://blog.csdn.net/ianly123/article/details/80565614并进行修正。 打开 Chrome 浏览器&#xff0c;进入需要截图的网站页面。打开开发者工具&#xff1a;在页面任何地方点击…