//Dijkstra(邻接矩阵)模板 #include<iostream> using namespace std; #define M 100 int maxData=10000000; int graph[M][M]; int d[M]; int pre[M]; //存储节点前驱 bool final[M]; int t,n; void Dij(int src) { int i,j; int minData; int v; memset(final,0,sizeof(final)); for(i=1;i<=n;++i) { d[i] = graph[src][i]; if(d[i]<maxData) pre[i]=src; else pre[i]=0; } final[src]=true; d[src]=0; for(i=1;i<n;++i) { minData = maxData; for(j=1;j<=n;++j) { if(!final[j] && d[j]<minData) { v = j; minData=d[j]; } } final[v]=true; for(j=1;j<=n;++j) { if(!final[j] && graph[v][j]<maxData && d[j]>d[v]+graph[v][j]) { d[j]=d[v]+graph[v][j]; pre[j]=v; //前驱节点更新 } } } cout<<d[1]<<endl; //输出所需的最短路 } int main() { // freopen("1.txt","r",stdin); int i,j; int start,end,cost; while(cin>>t>>n) { for(i=1;i<=n;++i) //此处别忘了进行初始化临界矩阵为无穷大 { for(j=1;j<=n;++j) { graph[i][j]=maxData; } } for(i=1;i<=t;++i) { cin>>start>>end>>cost; if(cost<graph[start][end]) //重边判断 { graph[start][end]=cost; graph[end][start]=cost; } } Dij(n); //输出最短路径(如果需要从源点到终点输出可利用栈实现) int p = 1; //终点 while(p!=n) //源点 { cout<<p<<"->"; p = pre[p]; } cout<<p<<endl; } return 0; } //求最短路径 //flody算法,可以算出任意两点之间的距离。 #include<iostream> using namespace std; #define maxn 501 int p,q,k,n; int map[maxn][maxn]; int dist[maxn][maxn]; void flody() { for(k=1;k<=n;k++)//枚举中间的点 for(p=1;p<=n;p++)//起点 if(dist[p][k]>0) { for(q=1;q<=n;q++)//终点 if(dist[k][q]>0) { if(((dist[p][q]>dist[p][k]+dist[k][q]) || (dist[p][q]==0)) && (p!=q)) dist[p][q]=dist[p][k]+dist[k][q]; } } } int main() { freopen("in.txt","r",stdin); memset(map,0,sizeof(map)); memset(dist,0,sizeof(dist)); cin>>n; for(p=1;p<=n;p++) for(q=1;q<=n;q++) { cin>>map[p][q]; dist[p][q]=map[p][q]; } flody(); for(p=1;p<=n;p++) { for(q=1;q<=n;q++) { if(dist[p][q]==0) cout<<"-1"<<" "; else cout<<dist[p][q]<<" "; } cout<<endl; } return 0; } #include<iostream> #include<queue> using namespace std; #define M 100 #define maxData 0x7fffffff int dis[M][M],ncount,d[M]; bool final[M]; int pre[M]; void SPFA(int src) { queue<int> myqueue; int i; memset(final,0,sizeof(final)); memset(pre,-1,sizeof(pre)); myqueue.push(src); for(i=0;i<=ncount;++i) //SPFA算法与Dij不同,SPFA初始化时将除源点以外所有点的最短距离初始化无穷大 { d[i] = maxData; } d[src] = 0; //源点最短距离设置成0 final[src] = true; while(!myqueue.empty()) //SPFA算法可入队列多次 { int frontint = myqueue.front(); myqueue.pop(); final[frontint] = false; for(i=0;i<=ncount;++i) //遍历所有结点 { if(dis[frontint][i]<maxData && d[i]>d[frontint]+dis[frontint][i]) { d[i] = d[frontint]+dis[frontint][i]; pre[i] = frontint; //修改前驱 if(!final[i]) { final[i] = true; myqueue.push(i); } } } } } int main() { // freopen("in.txt","r",stdin); int i,j,k,m,w; while(scanf("%d %d",&ncount,&m)!=EOF) { for(i=1;i<=ncount;i++) for(j=1;j<=ncount;j++) dis[i][j]=maxData; for(i=1;i<=m;i++) { scanf("%d %d %d",&j,&k,&w); dis[j][k]=w; dis[k][j]=w; } SPFA(1); for(i=1;i<=m;i++) { printf("%d/n",d[i]); for(j=i;j!=1;j=pre[j]) printf("%d->%d/n",j,pre[j]); } } return 0; }