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 }