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

Problem Description
Congratulations!
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.
 
Input
Input
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.
 
Output
For each test case, output a single line of the form

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.

 
Sample Input
7
0 2 10
0 3 6
2 4 5
3 4 3
3 5 4
4 1 7
5 1 8
0
 
Sample Output
0 3 4 1 3

题意是给出 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(最短路)的更多相关文章

  1. HDU 4725 The Shortest Path in Nya Graph(最短路拆点)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4725 题意:n个点,某个点属于某一层.共有n层.第i层的点到第i+1层的点和到第i-1层的点的代价均是 ...

  2. HDU 6071 Lazy Running(很牛逼的最短路)

    http://acm.hdu.edu.cn/showproblem.php?pid=6071 题意: 1.2.3.4四个点依次形成一个环,现在有个人从2结点出发,每次可以往它相邻的两个结点跑,求最后回 ...

  3. 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 ...

  4. HDU 5669 线段树优化建图+分层图最短路

    用线段树维护建图,即把用线段树把每个区间都标号了,Tree1中子节点有到达父节点的单向边,Tree2中父节点有到达子节点的单向边. 每次将源插入Tree1,汇插入Tree2,中间用临时节点相连.那么T ...

  5. 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 ...

  6. HDU 2066 一个人的旅行(单源最短路SPFA)

    Description 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历,还 ...

  7. HDU 3666 THE MATRIX PROBLEM (差分约束,最短路)

    题意: 给一个n*m矩阵,每个格子上有一个数字a[i][j],给定L和U,问:是否有这样两个序列{a1...an}和{b1...bn},满足 L<=a[i][j]*ai/bj<=U .若存 ...

  8. 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 ...

  9. 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 ...

随机推荐

  1. vue项目中使用echarts map报错Cannot read property 'push' of undefined nanhai.js

    在vue中绘制地图需要加载一个本地china.json文件,我用的是get请求的方法加载的,而不是直接import,因为我怕import请求到的部署到线上的时候会有问题.如下是get请求方法: thi ...

  2. SpringBoot搭建基于Spring+SpringMvc+Mybatis的REST服务

    Maven Plugin管理 通常,让你的Maven POM文件继承 spring-boot-starter-parent,并声明一个或多个 Starter POMs依赖即可. spring-boot ...

  3. 软件安装——彻底卸载MySQL

    如果你的电脑里装过MySQL,想再重新安装MySQL的时候可能就会因为前一版本卸载不彻底而出现错误.最常见的就是安装好后设置参数的最后一步验证时,会在Execute configurattion步骤中 ...

  4. Leetcode 11. Container With Most Water(逼近法)

    11. Container With Most Water Medium Given n non-negative integers a1, a2, ..., an , where each repr ...

  5. IO 输入输出流

    1) 数据流: 一组有序,有起点和终点的字节的数据序列.包括输入流和输出流.

  6. GPG(pgp)加解密中文完整教程

    一.介绍 我们都知道,互联网是不安全的,但其上所使用的大部分应用,如Web.Email等一般都只提供明文传输方式(用https.smtps等例外).所以,当我们需要传输重要文件时,应该对当中的信息加密 ...

  7. Mapreduce报错:Split metadata size exceeded 10000000

    报错信息: Failure Info:Job initialization failed: java.io.IOException: Split metadata size exceeded 1000 ...

  8. Vertical Center TextView . 竖直居中的UITextView

    @interface VerticalCenterTextView : UITextView @end @implementation VerticalCenterTextView - (void) ...

  9. 【GIS数据处理】 利用空间关系建立线CAD数据和属性表关联

    这两天遇到一个不太容易解决的问题. 某燃气公司想自己对自建管线进行测绘便于数字化管理,在接受了简单的RTK测量培训和Cass成图培训后,就自己着手开干. 最近数据整理的差不多了,就提交给我请我帮忙核查 ...

  10. 【win Server】 那些天建立群集和SQL AlwaysOn踩到的雷……

    这是一篇悲伤的博 因为前几天一直在折腾群集配置和AlwaysOn,踩雷有数,但是死到现在没成功... 搭建AlwaysOn环境需要: 1. windows Server2012 DataCenter版 ...