hdu 2066 一个人的旅行(SPFA算法)
2015-08-19 21:36
423 查看
本题链接:点击打开链接
本题大意:
输入T,S,D,表示有T条边,S个起点,D个终点;每条边输入两个点及边权,然后输入起点和终点;本题关键是有多个起点,从而求最短距离不好求,可采取相应方法进行简化,将每个起点与另外的一个点连接,使其边权为0,这样即可使起点变成一个;然后比较到每个终点的距离即可。参考代码:
本题大意:
输入T,S,D,表示有T条边,S个起点,D个终点;每条边输入两个点及边权,然后输入起点和终点;本题关键是有多个起点,从而求最短距离不好求,可采取相应方法进行简化,将每个起点与另外的一个点连接,使其边权为0,这样即可使起点变成一个;然后比较到每个终点的距离即可。参考代码:
#include<stdio.h> #include<string.h> #include<queue> #include<algorithm> #define MAXN 10010 #define MAXM 20020 #define INF 0x3f3f3f3f using namespace std; int head[MAXN]; int mark[MAXN]; int dis[MAXN]; struct node{ int from,to,val,next; }; node edge[MAXM]; int num; void getmap(int u,int v,int w) { node e={u,v,w,head[u]}; edge[num]=e; head[u]=num++; } void SPFA(int s) { queue<int>q; memset(mark,0,sizeof(mark)); memset(dis,INF,sizeof(dis)); q.push(s); while(!q.empty()) { int top=q.front(); q.pop(); mark[s]=1; dis[s]=0; for(int i=head[top];i!=-1;i=edge[i].next) { int u=edge[i].to; if(dis[u]>dis[top]+edge[i].val) { dis[u]=dis[top]+edge[i].val; if(!mark[u]) { mark[u]=1; q.push(u); } } } } } int main() { int t,s,d,start,end; while(scanf("%d%d%d",&t,&s,&d)!=EOF) { memset(head,-1,sizeof(head)); num=0; int m=INF; for(int i=0;i<t;i++) { int a,b,time; scanf("%d%d%d",&a,&b,&time); getmap(a,b,time); getmap(b,a,time); } for(int i=0;i<s;i++) { scanf("%d",&start); getmap(0,start,0); getmap(start,0,0); } SPFA(0); for(int i=0;i<d;i++) { scanf("%d",&end); m=min(m,dis[end]); } printf("%d\n",m); } return 0; }
相关文章推荐
- Java依据Url下载图片
- 用jquery实现小火箭到页面顶部的效果
- ViewState的用法
- HDU 4715 Difference Between Primes (素数表+二分)
- hdu 5319 Painter 2015 Multi-University Training Contest 3
- 无备份情况--恢复密码文件
- redirect、redirectAction等比较
- hdu 1000 A + B Problem
- 静态链表的插入和删除(六)
- java学习记录笔记--多态,接口,UML简介
- IBM GDC 面试经验
- 阿里校招 数据分析师 笔试题
- 屏幕截图,后台音频播放
- R中的基本函数运算
- 08-19 Activity启动 全屏,横、竖屏 FrameLayout TableLayout Intent Extra传递数据
- hdu 4712Hamming Distance (厕所大号出的题解)随机函数~
- Ubantu下搭建Hadoop2.x完全分布式集群
- C语言中,二维数组中,p+1与*(p+1)的区别
- 100盏灯的问题
- Android获取各个应用程序的缓存文件代码小片段(使用AIDL)