dijkstra

来源:互联网 发布:access数据库安装包 编辑:程序博客网 时间:2024/05/29 06:46
#include"iostream"  //2544#include"algorithm"#include"string"#include"vector"#include"cstdio"#include"cstring"#include"queue"using namespace std;const int maxn=100;const int inf=1000000;struct edge{int from,to,dist;edge(int f,int t,int d):from(f),to(t),dist(d){}};struct node{int d,u;node(int dd,int uu):d(dd),u(uu){}friend bool operator < (node a,node b)  //优先队列中从根据d小到大排序{return a.d>b.d;}};struct dijkstra{vector<edge>edges;vector<int>g[maxn];int n,m;bool done[maxn];int d[maxn];int p[maxn];  //记录上一条弧void init(int n){this->n=n;for(int i=0;i<maxn;i++)g[i].clear();edges.clear();}void add(int from,int to,int dist){edges.push_back(edge(from,to,dist));m=edges.size();g[from].push_back(m-1);}void main(int s){priority_queue<node>Q;for(int i=0;i<n;i++) d[i]=inf;memset(done,0,sizeof(done));d[s]=0;Q.push(node(0,s));while(!Q.empty()){node x=Q.top();Q.pop();int u=x.u;if(done[u]) continue;done[u]=true;for(int i=0;i<g[u].size();i++){edge & e= edges[g[u][i]];if(d[e.to]>d[e.from]+e.dist){d[e.to]=d[e.from]+e.dist;p[e.to]=g[u][i];Q.push(node(d[e.to],e.to));}}}}};int main(){//freopen("a.txt","r",stdin);dijkstra a;int n,m;while(scanf("%d%d",&n,&m),n,m){a.init(n);for(int i=0;i<m;i++){int s,t,dist;scanf("%d%d%d",&s,&t,&dist);a.add(s-1,t-1,dist);a.add(t-1,s-1,dist);}a.main(0);cout<<a.d[n-1]<<endl;}return 0;}

0 0
原创粉丝点击