/******************************************************************** ** @file d.cpp ** @date Thu Apr 28 20:53:05 2011 ** @brief ******普通Dijstra算法******** ** 以poj 2387 做试验 ********************************************************************/ #include<iostream> #include<cstring> using namespace std; #define MAX 1001 #define INF 1e9 int t,n;int g[MAX][MAX]; void input(){ cin>>t>>n;int v1,v2,w; for(int i=1;i<=n;++i){ for(int j=1;j<=n;++j) g[i][j]=INF; } for(int i=0;i<t;++i){ cin>>v1>>v2>>w; if(w<g[v1][v2]){ g[v1][v2]=w;g[v2][v1]=w; } } } int Dijistra(){ int d[MAX];bool visted[MAX]={false}; for(int i=1;i<=n;++i)d[i]=(i==1?0:INF); for(int i=1;i<=n;++i){ int x,m=INF; for(int y=1;y<=n;++y)if(!visted[y] && m>=d[y])m=d[x=y]; visted[x]=true; for(int y=1;y<=n;++y) d[y]=(d[y]<d[x]+g[x][y])?d[y]:(d[x]+g[x][y]); } return d[n]; } int main(int argc, char *argv[]) { input(); cout<<Dijistra()<<endl; return 0; }
使用优先队列的Dijsktra算法
/******************************************************************** ** @file poj2387.cpp ** @date Thu May 12 16:12:19 2011 ** @brief 使用了优先队列的Dijsktra算法 ** ********************************************************************/ #include<stdio.h> #include<string.h> #include<queue> using namespace std; #define MAX 4003 #define INF 999999 struct node{ int v,w,next; }e[MAX]; int p[MAX],t,n; void input(){ int index=0; int a,b,w; //稀疏图的临界表法,当然在c++中可以用向量vector存储稀释图 scanf("%d%d",&t,&n); memset(p,-1,sizeof(p)); for(int i=0;i<t;++i){ scanf("%d%d%d",&a,&b,&w); a--;b--;//每次都是倒着插入 e[index].v=b;//a顶点指向b 即:a->b e[index].w=w;//a到b这条边的权重 e[index].next=p[a];//a所连接的另一条边 p[a]=index++; //因为是无向图 e[index].v=a; e[index].w=w; e[index].next=p[b]; p[b]=index++; } } int min(int a,int b){ return a>b?b:a; } int Dijistra(){ int d[MAX]; bool vis[MAX]={false }; for(int i=0;i<n;++i)d[i]=(i==0?0:INF); typedef pair<int,int>pii;//pair 定义了自己的排序规则--先比较第一维,相等才比较第二维 priority_queue<pii,vector<pii>,greater<pii> >q; q.push(make_pair(d[0],0)); while(!q.empty()){ pii u=q.top();q.pop(); int x=u.second; for(int i=p[x];i!=-1;i=e[i].next) if(d[e[i].v]>d[x]+e[i].w){ d[e[i].v]=d[x]+e[i].w; q.push(make_pair(d[e[i].v],e[i].v)); } } return d[n-1]; } int main(int argc, char *argv[]) { input(); printf("%d/n",Dijistra()); return 0; }