HDU2544-最短路-dijikstra板子

 1 #include <cmath>
 2 #include <queue>
 3 #include <cstdio>
 4 #include <cstdlib>
 5 #include <cstring>
 6 #include <iostream>
 7 #include <algorithm>
 8 using namespace std;
 9 struct edge{
10     int next,v,w;
11     edge(int next=0,int v=0,int w=0):next(next),v(v),w(w){}
12 };
13 
14 const int MAXN=105,MAXM=10005;
15 
16 int head[MAXN],cnt;edge e[MAXM*2];
17 void init_G(){cnt=0,memset(head,0,sizeof(head)),memset(e,0,sizeof(e));}
18 
19 void add(int u,int v,int w){
20     e[++cnt]=edge(head[u],v,w),head[u]=cnt;
21     e[++cnt]=edge(head[v],u,w),head[v]=cnt;
22 }
23 
24 struct node{
25     int dis,u;
26     bool operator<(const node NEXT)const{return dis<NEXT.dis;}
27     node(int dis=0,int u=0):dis(dis),u(u){}
28 };
29 
30 int d[MAXN];void init_d(int n){for(int i=1;i<=n;i++)d[i]=1e9;}
31 
32 int dijkstra(int s,int t){
33     init_d(t);
34     priority_queue<node>q;
35     d[s]=0,q.push(node(0,s));
36     for(int u,v;!q.empty();){
37         u=q.top().u,q.pop();
38         for(int i=head[u];i;i=e[i].next){
39             v=e[i].v;
40             if(d[v]>d[u]+e[i].w) {
41                 d[v]=d[u]+e[i].w;
42                 q.push(node(d[v],v));
43             }
44         }
45         
46     }
47     return d[t];
48 }
49 
50 int main(){
51     for(int n,m;scanf("%d%d",&n,&m),n+m;){
52         init_G();
53         for(int i=1,A,B,C;i<=m;i++)cin>>A>>B>>C,add(A,B,C);            
54         cout<<dijkstra(1,n)<<endl;
55     }
56     return 0;
57 }

 

 

 

有些没用的板子!

 

 

 1 #include <cmath>
 2 #include <queue>
 3 #include <cstdio>
 4 #include <cstdlib>
 5 #include <cstring>
 6 #include <iostream>
 7 #include <algorithm>
 8 using namespace std;
 9 struct point{
10     int a,b;
11     point(int a=0,int b=0):a(a),b(b){}
12     bool operator<(const point NEXT)const{return (a==NEXT.a)?(b<NEXT.b):(a<NEXT.a);}
13     void out(){printf("(%d,%d)",a,b);}
14 };
15 
16 bool comp(point A,point B){return (A.a==B.a)?(A.b>B.b):(A.a<B.a);}
17 
18 void sortForTwoSet(){
19     point A[5]={point(1,2),point(1,4),point(2,5),point(3,5),point(1,3)};
20     sort(A,A+5,comp);
21     for(int i=0;i<5;i++){A[i].out();cout<<" ";}
22 }
23 
24 struct edge{
25     int next,v,w;
26     edge(int next=0,int v=0,int w=0):next(next),v(v),w(w){}
27 };
28 
29 const int MAXN=105,MAXM=10005;
30 
31 int head[MAXN],cnt;
32 edge e[MAXM*2];
33 
34 void init_G(){
35     cnt=0,memset(head,0,sizeof(head));
36     memset(e,0,sizeof(e));
37 }
38 
39 void add(int u,int v,int w){
40     e[++cnt]=edge(head[u],v,w),head[u]=cnt;
41     e[++cnt]=edge(head[v],u,w),head[v]=cnt;
42 }
43 
44 struct node{
45     int dis,u;
46     bool operator<(const node NEXT)const{return dis<NEXT.dis;}
47     node(int dis=0,int u=0):dis(dis),u(u){} 
48     //优先队列默认大根堆,要反过来才是小根堆 
49 };
50 
51 int d[MAXN];void init_d(int n){for(int i=1;i<=n;i++)d[i]=1e9;}
52 typedef pair<int,int> P;
53 
54 int dijkstra(int s,int t){
55     init_d(t);
56     priority_queue<node>q;//priority_queue<P,vector<P>,greater<P> >q;//第一维度为距离,第二维度为点     
57     d[s]=0,q.push(node(0,s));//d[s]=0,q.push(make_pair(0,s));
58     for(int u,v;!q.empty();){
59         u=q.top().u,q.pop();//u=q.top().second,q.pop();
60         for(int i=head[u];i;i=e[i].next){
61             v=e[i].v;
62             if(d[v]>d[u]+e[i].w) {
63                 d[v]=d[u]+e[i].w;
64                 q.push(node(d[v],v));//q.push(make_pair(d[v],v));
65             }
66         }
67         
68     }
69     return d[t];
70 }
71 
72 int main(){
73     for(int n,m;scanf("%d%d",&n,&m),n+m;){
74         init_G();
75         for(int i=1,A,B,C;i<=m;i++)cin>>A>>B>>C,add(A,B,C);            
76         cout<<dijkstra(1,n)<<endl;
77     }
78     return 0;
79 }

 

posted @ 2020-10-16 23:15  墨鳌  阅读(130)  评论(0编辑  收藏  举报