最短路。

把题目抽象一下:已知一张图,边上的权值表示长度。现在又有一些边,只能从其中选一条加入原图,使起点->终点的距离最小。

当加上一条边a->b,如果这条边更新了最短路,那么起点st->终点ed的最小距离=st->a  +  a->b  +b->ed 三个值的最短距离之和。于是正反求两次单元最短路。再将k条边遍历一遍就好了。

最近在改代码风格,写起来很别扭。。uva又挂了,最让我不理解的是http://www.cnblogs.com/arbitrary/archive/2013/02/06/2908099.html这个家伙的代码竟然能ac,问题是我稍微改一下就submission error,难道代码还能防盗= =

 #include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
#define clr(a,x) memset(a,x,sizeof(a));
#define ref(i,a,b) for(int i=a;i<=b;i++)
using namespace std; const int MAXN=;
const int INF =; struct Edge{
int u,v,c;
}; struct Node{
int d,u;
bool operator <(const Node x)const {
return d>x.d;
}
}; struct Dij{
int n,m;
vector<Edge>edge;
vector<int>G[MAXN];
bool vis[MAXN];
int d[MAXN];
int p[MAXN]; void init(int n)
{
this->n=n;
ref(i,,n-)G[i].clear();
edge.clear();
} void add(int u,int v,int c)
{
edge.push_back((Edge){u,v,c});
m=edge.size();
G[u].push_back(m-);
} void dij(int st)
{
priority_queue<Node>q;
ref(i,,n-)d[i]=(i==st)?:INF;
clr(vis,);
q.push((Node){,st});
while(!q.empty())
{
Node x=q.top();
q.pop();
int u=x.u;
if(vis[u])
continue;
vis[u]=true;
ref(i,,G[u].size()-){
Edge e=edge[G[u][i]];
if(d[e.v]>d[u]+e.c){
d[e.v]=d[u]+e.c;
p[e.v]=G[u][i];
q.push((Node){d[e.v],e.v});
}
}
}
}
}; Dij solver;
int d1[MAXN],d2[MAXN];
int p[MAXN]; int main()
{
int cnt=;
int n,m,k,st,ed;
while(~scanf("%d%d%d",&n,&st,&ed))
{
if(cnt++)
puts(""); st--;ed--;
solver.init(n); int u,v,c;
scanf("%d",&m);
ref(i,,m-){
scanf("%d%d%d",&u,&v,&c);
u--;v--;
solver.add(u,v,c);
solver.add(v,u,c);
} solver.dij(st);
ref(i,,n-)
d1[i]=solver.d[i]; solver.dij(ed);
ref(i,,n-){
d2[i]=solver.d[i];
p[i]=solver.p[i];
}
p[ed]=-; scanf("%d",&k);
int s=d1[ed],a,b;
a=b=-;
ref(i,,k-){
scanf("%d%d%d",&u,&v,&c);
u--;v--;
if(s>d1[u]+c+d2[v]){
s=d1[u]+c+d2[v];
a=u;b=v;
}
if(s>d1[v]+c+d2[u]){
s=d1[v]+c+d2[u];
a=v;b=u;
}
} int flog=;
if(a==-){ //不乘商务车
int x=st; while(x!=ed)
{
if(!flog){printf("%d",x+);flog=;}
else printf(" %d",x+);
x=solver.edge[p[x]].u; //p[]中保存的是 u->v 这条边的序号
}
printf(" %d",ed+);
printf("\nTicket Not Used\n%d\n",s);
}else{ //乘坐商务车
int x=st;
while(x!=a)
{
if(!flog){printf("%d",x+);flog=;}
else printf(" %d",x+);
x=solver.edge[p[x]].u;
}
if(x!=st)printf(" %d",x+);
else printf("%d",x+);
x=b;
while(x!=ed)
{
printf(" %d",x+);
x=solver.edge[p[x]].u;
}
printf(" %d\n",ed+);
printf("%d\n%d\n",a+,s);
}
}
return ;
} /*
4 1 4
4
1 2 2
1 3 3
2 4 4
3 4 5
1
1 4 7 2 1 2
1
1 2 2
1
1 2 1
*/

UVA 11374 Airport Express(最短路)的更多相关文章

  1. UVA - 11374 - Airport Express(堆优化Dijkstra)

    Problem    UVA - 11374 - Airport Express Time Limit: 1000 mSec Problem Description In a small city c ...

  2. UVA - 11374 Airport Express (Dijkstra模板+枚举)

    Description Problem D: Airport Express In a small city called Iokh, a train service, Airport-Express ...

  3. UVA 11374 Airport Express SPFA||dijkstra

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  4. UVA 11374 Airport Express 机场快线(单源最短路,dijkstra,变形)

    题意: 给一幅图,要从s点要到e点,图中有两种无向边分别在两个集合中,第一个集合是可以无限次使用的,第二个集合中的边只能挑1条.问如何使距离最短?输出路径,用了第二个集合中的哪条边,最短距离. 思路: ...

  5. UVA 11374 Airport Express(枚举+最短路)

    枚举每条商业线<a, b>,设d[i]为起始点到每点的最短路,g[i]为终点到每点的最短路,ans便是min{d[a] + t[a, b] + g[b]}.注意下判断是否需要经过商业线.输 ...

  6. UVA 11374 Airport Express (最短路)

    题目只有一条路径会发生改变. 常见的思路,预处理出S和T的两个单源最短路,然后枚举商业线,商业线两端一定是选择到s和t的最短路. 路径输出可以在求最短路的同时保存pa数组得到一棵最短路树,也可以用di ...

  7. UVa 11374 - Airport Express ( dijkstra预处理 )

    起点和终点各做一次单源最短路, d1[i], d2[i]分别代表起点到i点的最短路和终点到i点的最短路,枚举商业线车票cost(a, b);  ans = min( d1[a] + cost(a, b ...

  8. 【uva11374】Airport Express 最短路

    题意: 在Iokh市中,机场快线是市民从市内去机场的首选交通工具.机场快线分为经济线和商业线两种,线路,速度和价钱都不同.你有一张商业线车票,可以坐一站商业线,而其他时候只能乘坐经济线.假设换乘时间忽 ...

  9. uva 11374 最短路+记录路径 dijkstra最短路模板

    UVA - 11374 Airport Express Time Limit:1000MS   Memory Limit:Unknown   64bit IO Format:%lld & %l ...

随机推荐

  1. SpringJUnit4加载类目录下(src)和WEF-INF目录下的配置文件二--获取注入的bean的二种方式

    前言: spring容器以xml的形式注入bean,然后可以在类中获取,获取的形式主要有二种:第一种最简单--采用@Resource 或@Autowired关键字在加载spring文件时将bean注入 ...

  2. C#中Json和List/DataSet相互转换

    #region List<T> 转 Json        /// <summary>        /// List<T> 转 Json        /// & ...

  3. 一个Java程序员应该掌握的10项技能

    1.语法:必须比较熟悉,在写代码的时候IDE的编辑器对某一行报错应该能够根据报错信息知道是什么样的语法错误并且知道任何修正. 2.命令:必须熟悉JDK带的一些常用命令及其常用选项,命令至少需要熟悉:a ...

  4. Mutex vs Semaphore

    What are the differences between Mutex vs Semaphore? When to use mutex and when to use semaphore? Co ...

  5. SpingMVC ModelAttribute的用法

    @Controller @RequestMapping(value = "/test") public class TestController { @RequestMapping ...

  6. 教育行业SaaS选型 需要注意的三点问题

    2008年经济危机席卷全球,造成世界范围内的金融动荡,国内各行业虽然都面临了不小的冲击,但是在危机面前,中国的教育行业却逆势而上,硕果累累.据统计,2008年教育行业的投资案例达18起,投资金额18. ...

  7. [SharePoint 2013 入门教程 3 ] 排版第一个网站集,网站

    我们创建了一个TEST网站集,如果你觉得太丑,怎么办,我们一起来给它整整容吧. 点击页面--> 编辑页面 我们现在就可以在页面上添加各种部件,进行布局排版.

  8. Mybatis全部查询遇到的返回类型的小问题

    在学习Mybatis3过程中遇到一个小问题,觉得需要注意就把它写下来了 在查询所有数据的时候方法是这样的 public List<User> findAll(){ ..... } 在它的u ...

  9. 去掉eclipse的xml和js验证

    一.XML Properties > Validation you have two options: 1- Configure Workspace Settings (disable the ...

  10. python自省指南

    深入python中对自省的定义: python的众多强大功能之一,自省,正如你所知道的,python中万物皆对象,自省是指代码可以查看内存中以对象形式存在的其他模块和函数,获取它们的信息,并对它们进行 ...