【uva11374】Airport Express 最短路
2016-03-22 14:01
501 查看
题意:
在Iokh市中,机场快线是市民从市内去机场的首选交通工具。机场快线分为经济线和商业线两种,线路,速度和价钱都不同。你有一张商业线车票,可以坐一站商业线,而其他时候只能乘坐经济线。假设换乘时间忽略不计,你的任务是找一条去机场最快的路线。
分析:
因为商业线只能走一次,我们就枚举走哪条商业线(或不走),用2次单源最短路分别求从起点和终点出发到所有路的最短路,最后比较即可。
这里我最短路打的是spfa。
代码如下:(注意输出格式)
[uva11374]
2016-03-22 14:01:08
在Iokh市中,机场快线是市民从市内去机场的首选交通工具。机场快线分为经济线和商业线两种,线路,速度和价钱都不同。你有一张商业线车票,可以坐一站商业线,而其他时候只能乘坐经济线。假设换乘时间忽略不计,你的任务是找一条去机场最快的路线。
分析:
因为商业线只能走一次,我们就枚举走哪条商业线(或不走),用2次单源最短路分别求从起点和终点出发到所有路的最短路,最后比较即可。
这里我最短路打的是spfa。
代码如下:(注意输出格式)
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #include<queue> using namespace std; #define Maxn 1010 struct node { int x,y,c,next; }t[2*Maxn];int len; int n,s,e,m,k; int first[Maxn],dis[Maxn],d[Maxn]; int td[Maxn],tds[Maxn]; bool inq[Maxn]; void ins(int x,int y,int c) { t[++len].x=x;t[len].y=y;t[len].c=c; t[len].next=first[x];first[x]=len; } void spfa(int s) { queue<int > q; while(!q.empty()) q.pop(); q.push(s); memset(dis,63,sizeof(dis)); memset(inq,0,sizeof(inq)); dis[s]=0;tds[s]=0; while(!q.empty()) { int x=q.front();q.pop(); for(int i=first[x];i;i=t[i].next) { int y=t[i].y; if(dis[y]>dis[x]+t[i].c) { dis[y]=dis[x]+t[i].c; tds[y]=x; if(!inq[y]) {inq[y]=1;q.push(y);} } } inq[x]=0; } } void output(int x) { if(x==0) return; output(td[x]); if(td[x]!=0) printf(" "); printf("%d",x); } int main() { int kase=0; while(scanf("%d%d%d",&n,&s,&e)!=EOF) { scanf("%d",&m);len=0; memset(first,0,sizeof(first)); for(int i=1;i<=m;i++) { int x,y,c; scanf("%d%d%d",&x,&y,&c); ins(x,y,c);ins(y,x,c); } scanf("%d",&k); spfa(s); for(int i=1;i<=n;i++) d[i]=dis[i]; for(int i=1;i<=n;i++) td[i]=tds[i]; spfa(e); int ans=dis[s],ax,ay,ak; int ssum=1; for(int i=1;i<=k;i++) { int x,y,c; scanf("%d%d%d",&x,&y,&c); if(d[x]+dis[y]+c<ans) ax=x,ay=y,ans=d[x]+dis[y]+c,ssum=1; else if(d[x]+dis[y]+c==ans) ssum++; if(d[y]+dis[x]+c<ans) ax=y,ay=x,ans=d[y]+dis[x]+c; else if(d[y]+dis[x]+c==ans) ssum++; } if(kase!=0) printf("\n"); kase++; if(ans==dis[s]) { printf("%d",s); for(int i=tds[s];i;i=tds[i]) printf(" %d",i); printf("\nTicket Not Used\n"); } else { output(ax); for(int i=ay;i;i=tds[i]) printf(" %d",i); printf("\n%d\n",ax); } printf("%d\n",ans); } return 0; }
[uva11374]
2016-03-22 14:01:08
相关文章推荐
- 查找行迁移及消除行迁移(chained rows)
- 韦玮:解决Ubuntu的root账号无法登录SSH问题-Permission denied, please try again.
- maven中指定main方法并且导入关联jar包
- Wait和Sleep的区别
- 人工智能的突破需要颠覆图灵机吗?
- 人工智能
- 2016-03-22 OneZero团队 Daily Scrum Meeting
- My Dad said
- NEU 1685: All Pair Shortest Path
- 【杭电oj】1787 - GCD Again(欧拉函数)
- 你真的了解人工智能吗?——聊聊AI的碰壁和冬天
- 220. Contains Duplicate III
- http://blog.csdn.net/lmj623565791/article/details/50709663
- 利用aircrack-ng工具获取附近wifi的密码
- container_of()宏
- The view hierarchy is not prepared for the constraint
- Cube painting id: 253
- LeetCode 172. Factorial Trailing Zeroes(阶乘结果尾数0的个数)---E
- http://blog.csdn.net/olanlanxiari/article/details/8104505
- 概率