您的位置:首页 > 其它

hdu2066 一个人的旅行 最短路

2017-03-19 03:30 302 查看
单源最短路裸题

1 #include<stdio.h>        //基本需要的头文件
2 #include<string.h>
3 #include<queue>
4 #include<algorithm>
5 using namespace std;
6 const int INF=0x3f3f3f3f;
7
8 const int maxn=1e3+5;
9 const int maxm=1e5+5;
10
11 struct pii{
12     int dis;
13     int s;
14     bool operator < (const pii x)const{
15         return dis > x.dis;
16     }
17     pii(int a,int b):dis(a),s(b){};
18 };
19 int head[maxn],nxt[maxm<<1],val[maxm<<1],point[maxm<<1],size;
20 int dis[maxn];
21
22 void init(){
23     memset(head,-1,sizeof(head));
24     size=0;
25 }
26
27 void add(int a,int b,int v){
28     point[size]=b;
29     val[size]=v;
30     nxt[size]=head[a];
31     head[a]=size++;
32 }
33
34 void dij(int s,int t){            //传入出发点和到达点
35     int i;
36     priority_queue<pii>q;
37     q.push(pii(0,s));
38     memset(dis,0x3f,sizeof(dis));
39     dis[s]=0;
40     while(!q.empty()){
41         pii u=q.top();
42         q.pop();
43         if(u.dis>dis[u.s])continue;
44         for(i=head[u.s];~i;i=nxt[i]){
45             int j=point[i];
46             if(dis[j]>u.dis+val[i]){
47                 dis[j]=u.dis+val[i];
48                 q.push(pii(dis[j],j));
49             }
50         }
51     }
52     printf("%d\n",dis[t]);        //或去掉在主函数中输出或操作
53 }
54
55 int main(){
56     int t,s,d;
57     while(scanf("%d%d%d",&t,&s,&d)!=EOF){
58         init();
59         while(t--){
60             int a,b,v;
61             scanf("%d%d%d",&a,&b,&v);
62             add(a,b,v);
63             add(b,a,v);
64         }
65         for(int i = 1 ; i <= s ; ++ i){
66             int a;
67             scanf("%d",&a);
68             add(0,a,0);
69         }
70         for(int i = 1 ; i <= d ; ++ i){
71             int a;
72             scanf("%d",&a);
73             add(a,1001,0);
74         }
75         dij(0,1001);
76     }
77     return 0;
78 }


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: