Hdu oj 2066 一个人的旅行
2015-08-19 20:34
429 查看
题目:点击打开链接
代码:
代码:
#include<stdio.h> #include<string.h> #include<vector> #include<queue> #include<algorithm> #define INF 0x3f3f3f3f using namespace std; struct Edge { int from,to,value,next; }edge[2010]; int head[2010],num; int d[1010],used[1010]; int m,n,p; int a1[1010],b1[1010]; void init() { num=0; memset(head,-1,sizeof(head)); } void add(int a,int b,int c) { edge[num].from=a; edge[num].to=b; edge[num].value=c; edge[num].next=head[a]; head[a]=num++; } void spfa(int x) { queue<int> q; memset(d,INF,sizeof(d));//初始化 memset(used,0,sizeof(used)); d[x]=0;//!起点为0 q.push(x); used[x]=1;//标记 while(!q.empty()) { int u=q.front(); q.pop(); used[u]=0;//!取消标记 这点与BFS 不同 for(int i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].to; if(d[v]>d[u]+edge[i].value)// 更新d { d[v]=edge[i].value+d[u]; if(!used[v]) { used[v]=1;//标记 q.push(v);// 更新后的d 进队列 } } } } } int main() { while(~scanf("%d%d%d",&m,&n,&p)) { init(); int i,j; int a,b,c; for(i=0;i<m;i++)//临接表未连接的边的权值不用 赋为INF { scanf("%d%d%d",&a,&b,&c); add(a,b,c); add(b,a,c); } for(i=0;i<n;i++)//注意输入格式 scanf("%d",&a1[i]); for(i=0;i<p;i++) scanf("%d",&b1[i]); c=INF; for(i=0;i<n;i++) { spfa(a1[i]); for(j=0;j<p;j++) { if(d[b1[j]]<c) c=d[b1[j]]; } } printf("%d\n",c); } return 0; }
相关文章推荐
- div滚动字幕
- Activity的2种启动方式
- OC数组的四大遍历方式和分析。
- 一个ajax的Post要求
- PostgreSQL Replication之第二章 理解PostgreSQL的事务日志(2)
- 简单且线程安全的两个单例模式java程序
- arraylist的使用
- sql 随机函数newid()
- Android 循环滑动viewpager
- HDU 5339 Untitled 状态压缩 BC round49 A
- UICollectionView在初始化的时候移动到某个距离
- iOS面试题五
- 时间改变一切
- VS编译设置
- C程序存储空间布局(一)——各数据段的内存位置
- 面试题收集
- JS 本地属性与继承属性
- PostgreSQL Replication之第二章 理解PostgreSQL的事务日志(1)
- 2.12 找出数组中和为给定的值的两个数字
- hdu 1465