HDU 2783 You’ll be Working on the Railroad(最短路)
You’ll be Working on the Railroad
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 246 Accepted Submission(s): 63
Your county has just won a state grant to install a rail system between
the two largest towns in the county -- Acmar and Ibmar. This rail
system will be installed in sections, each section connecting two
different towns in the county, with the first section starting at Acmar
and the last ending at Ibmar. The provisions of the grant specify that
the state will pay for the two largest sections of the rail system, and
the county will pay for the rest (if the rail system consists of only
two sections, the state will pay for just the larger section; if the
rail system consists of only one section, the state will pay nothing).
The state is no fool and will only consider simple paths; that is, paths
where you visit a town no more than once. It is your job, as a recently
elected county manager, to determine how to build the rail system so
that the county pays as little as possible. You have at your disposal
estimates for the cost of connecting various pairs of cities in the
county, but you're short one very important requirement -- the brains to
solve this problem. Fortunately, the lackeys in the computing services
division will come up with something.
will contain multiple test cases. Each case will start with a line
containing a single positive integer n<=50 , indicating the number of
railway section estimates. (There may not be estimates for tracks
between all pairs of towns.) Following this will be n lines each
containing one estimate. Each estimate will consist of three integers s e
c , where s and e are the starting and ending towns and c is the
cost estimate between them. (Acmar will always be town 0 and Ibmar will
always be town 1. The remaining towns will be numbered using consecutive
numbers.) The costs will be symmetric, i.e., the cost to build a
railway section from town s to town e is the same as the cost to go
from town e to town s , and costs will always be positive and no
greater than 1000. It will always be possible to somehow travel from
Acmar to Ibmar by rail using these sections. A value of n = 0 will
signal the end of input.
c1 c2 ... cm cost
where
each ci is a city on the cheapest path and cost is the cost to the
county (note c1 will always be 0 and cm will always be 1 and ci and ci +
1 are connected on the path). In case of a tie, print the path with the
shortest number of sections; if there is still a tie, pick the path
that comes first lexicographically.
题意是给出 n 条边。
问从 0 -> 1 可以忽略2条路权,所需总权最小是多少,路径是什么 。
只有1条边时,不可忽略。
有2条时,可以忽略一条。
因为 n 是很少 , 直接暴力枚举可以忽略的边。
然后跑dij.来维护一个最优的路径。
这条题思路不难,不过就是写起来有点恶心
#include <cstdio>
#include <cstring>
#include <queue>
#include <iostream>
#include <map>
#include <stack>
using namespace std ;
typedef pair<int,int> pii ;
#define X first
#define Y second
const int N = ;
const int inf = 1e9+ ;
typedef long long LL;
int n , xx[N] , pre[N] , ww[N] , tot ; vector<pii>g[N]; struct node {
int a , c , d , id ;
node(){};
node( int a , int c , int d , int id ):a(a),c(c),d(d),id(id){}
bool operator < ( const node &A ) const {
if( d != A.d ) return d > A.d ;
else if( c != A.c ) return c > A.c ;
else {
stack<int>s1 , s2; int id1 = id , id2 = A.id ;
while( id1 != - ) { s1.push( xx[id1] ); id1 = pre[id1] ; }
while( id2 != - ) { s2.push( xx[id2] ); id2 = pre[id2] ; }
while( !s1.empty() ) {
int a = s1.top() ; s1.pop() ;
int b = s2.top() ; s2.pop() ;
if( a > b ) return true ;
}
return false ;
}
}
};
int bestpath[N] , bestcnt , bestcost ;
int tmppath[N] , tmpcnt , tmpcost ; void Choose_best( int id , int cnt ) {
if( tmpcost > bestcost ) return ;
stack<int>s ;
while( id != - ) { s.push( xx[id] ); id = pre[id] ; }
tmpcnt = ;
while( !s.empty() ) { tmppath[tmpcnt++] = s.top() ; s.pop() ; } if( tmpcost < bestcost ) {
bestcnt = tmpcnt ;
bestcost = tmpcost ;
for( int i = ; i < tmpcnt ; ++i ) bestpath[i] = tmppath[i] ;
return ;
}
if( cnt > bestcnt ) return ;
else if( cnt < bestcnt ) {
bestcnt = tmpcnt ;
for( int i = ; i < tmpcnt ; ++i ) bestpath[i] = tmppath[i] ;
} else {
for( int i = ; i < tmpcnt ; ++i ) {
if( bestpath[i] > tmppath[i] ) {
for( int j = i ; j < bestcnt ; ++j ) {
bestpath[j] = tmppath[j] ;
}
} else if ( bestpath[i] < tmppath[i] ) {
break ;
}
}
}
} int dis[N] ; void dij() {
memset( dis , 0x3f , sizeof dis );
priority_queue<node>que;
tot = ; xx[tot] = , pre[tot] = - ; tot++ ;
que.push( node(,,,tot-) );
dis[] = ;
while( !que.empty() ) {
int u = que.top().a , cnt = que.top().c , cost = que.top().d , id = que.top().id ;
que.pop();
if( cost > dis[u] ) continue ;
if( u == ) {
if( dis[u] ) {
tmpcost = dis[u] ;
Choose_best( id , cnt );
}
return ;
}
for( int i = ; i < g[u].size() ; ++i ) {
int v = g[u][i].X , w = ww[g[u][i].Y] ;
if( dis[v] > dis[u] + w ) {
dis[v] = dis[u] + w ;
xx[tot] = v ; pre[tot] = id ; tot++;
que.push( node( v , cnt+ , dis[v] , tot - ) ) ;
}
}
}
} void Gao() {
dij();
for( int i = ; i < n ; ++i ) {
int cc = ww[i] ; ww[i] = ;
dij();
for( int j = i + ; j < n ; ++j ) {
int dd = ww[j] ; ww[j] = ;
dij(); ww[j] = dd ;
}
ww[i] = cc ;
}
for( int i = ; i < bestcnt ; ++i ) cout << bestpath[i] << ' ' ;
cout << bestcost << endl ;
} int Run() {
while( cin >> n && n ) {
bestcost = bestcnt = inf ;
for( int i = ; i < N ; ++i ) g[i].clear();
for( int i = ; i < n ; ++i ) {
int u , v , w ; cin >> u >> v >> w ;
ww[i] = w ;
g[u].push_back(pii(v,i));
g[v].push_back(pii(u,i));
}
Gao();
}
return ;
} int main() {
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif // LOCAL
ios::sync_with_stdio();
return Run();
}
HDU 2783 You’ll be Working on the Railroad(最短路)的更多相关文章
- HDU 4725 The Shortest Path in Nya Graph(最短路拆点)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4725 题意:n个点,某个点属于某一层.共有n层.第i层的点到第i+1层的点和到第i-1层的点的代价均是 ...
- HDU 6071 Lazy Running(很牛逼的最短路)
http://acm.hdu.edu.cn/showproblem.php?pid=6071 题意: 1.2.3.4四个点依次形成一个环,现在有个人从2结点出发,每次可以往它相邻的两个结点跑,求最后回 ...
- HDU 4725 The Shortest Path in Nya Graph [构造 + 最短路]
HDU - 4725 The Shortest Path in Nya Graph http://acm.hdu.edu.cn/showproblem.php?pid=4725 This is a v ...
- HDU 5669 线段树优化建图+分层图最短路
用线段树维护建图,即把用线段树把每个区间都标号了,Tree1中子节点有到达父节点的单向边,Tree2中父节点有到达子节点的单向边. 每次将源插入Tree1,汇插入Tree2,中间用临时节点相连.那么T ...
- hdu 5137 How Many Maos Does the Guanxi Worth 最短路 spfa
How Many Maos Does the Guanxi Worth Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 512000/5 ...
- HDU 2066 一个人的旅行(单源最短路SPFA)
Description 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历,还 ...
- HDU 3666 THE MATRIX PROBLEM (差分约束,最短路)
题意: 给一个n*m矩阵,每个格子上有一个数字a[i][j],给定L和U,问:是否有这样两个序列{a1...an}和{b1...bn},满足 L<=a[i][j]*ai/bj<=U .若存 ...
- hdu 1595 find the longest of the shortest【最短路枚举删边求删除每条边后的最短路,并从这些最短路中找出最长的那条】
find the longest of the shortest Time Limit: 1000/5000 MS (Java/Others) Memory Limit: 32768/32768 ...
- HDU 4725 The Shortest Path in Nya Graph (最短路)
The Shortest Path in Nya Graph Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
随机推荐
- 在Wi-Fi路由器中发现了新的安全漏洞
黑客利用两种互联网通用协议的互动的漏洞:传输控制协议,或TCP和Wi-Fi.该漏洞利用并不针对任何传统的安全漏洞.相反,安全方面的弱点在于20多年前制定的基本Wi-Fi设计决策极难改变. 中国黑客教父 ...
- asp.net能否上传文件夹下所有文件
HTML部分 <%@PageLanguage="C#"AutoEventWireup="true"CodeBehind="index.aspx. ...
- Eclipse中jar包的导出与导入
JAR的含义: JAR是Java的档案文件,是Java Archive File的缩写.jar文件是一种压缩文件,就是以特定类型压缩包的形式存在的完整Java项目.通常通过导入jar包的方式来使用实现 ...
- #1127-JSP表单处理
JSP 表单处理 我们在浏览网页的时候,经常需要向服务器提交信息,并让后台程序处理.浏览器中使用 GET 和 POST 方法向服务器提交数据. GET 方法GET方法将请求的编码信息添加在网址后面,网 ...
- RabbitMQ消息如何100%投递成功(六)
消息如何保障100%的投递成功? 什么是生产端的可靠性投递? 保障消息的成功发出 保障MQ节点的成功接收 发送端收到MQ节点(Broker)确认应答 完善的消息进行补偿机制(如网络问题没有返回确认应答 ...
- WWDC2017-advanced_animations_with_uikit
最后修改时间: 2017-12-1 官方视频链接 这个Session主要讲一下的几个内容: Basic(基础的): 动画工作原理 以及 动画如何计时 Interactive and Interrupt ...
- router-link传递参数并获取
跳转链接: <router-link :to="{path:'libraryDetail/', query:{library_id:data.library_id}}"> ...
- Linux文件系统启动过程及login的实现
1. busybox简介 busybox是一个集成了一百多个最常用linux命令和工具的软件,它将许多常用的LINUX命令和工具结合到了一个单独的可执行程序中.虽然与相应的GNU工具比较起来,busy ...
- MySQL与MongoDB的不同
数据存放的巨大不同
- 线性代数之——SVD 分解
SVD 分解是线性代数的一大亮点. 1. SVD 分解 \(A\) 是任意的 \(m×n\) 矩阵,它的秩为 \(r\),我们要对其进行对角化,但不是通过 \(S^{-1}A S\).\(S\) 中的 ...