最短路

来源:互联网 发布:ios 省市区json数据 编辑:程序博客网 时间:2024/04/30 23:15

                                                                                                                            城市平乱

           首先这道题是最短路问题,单源最短路问题最简单的是Dijkstra算法,多源最短路(即每一对点之间的距离)用Floyed算法,Floyed算法在这里应该会超时的。

首先说下Dijkstra算法的大体思路,

        第一步:源点进入集合S(U为整个点集),初始化与源点相连的点,没连得点初始化为正无穷,用数组D[i]记录由原点到各点的距离。

        第二步:在D[]中寻找离源点最近的点,找到后,进入集合S。

       第三步:以它为源点重复第一步和第二步直到d,结束条件是所有点都进一遍,也就是D[]更新点的个数-1次了。

   #include<iostream>#include<cstring>using namespace std;const int MAXM=1010;int M,N,P,K;int map[MAXM][MAXM],v[MAXM],site[MAXM];long long d[MAXM];void read_graph(){cin>>N>>M>>P>>K;int u,v,w;int i,j;memset(map,2,sizeof(map));for(i=0;i<N;i++)cin>>site[i];for(i=0;i<P;i++){cin>>u>>v>>w;map[u][v]=w;map[v][u]=w;}}void Dijkstra(){int i,x,y;memset(v,0,sizeof(v));for(i=0;i<=M;i++)d[i]=10000;d[K]=0;for(i=1;i<=M;i++){int m=10000;for(y=1;y<=M;y++)if(!v[y]&&d[y]<=m){x=y;m=d[y];}v[x]=1;for(y=1;y<=M;y++)if(d[y]>d[x]+map[x][y])d[y]=d[x]+map[x][y];}}int main(){int t,i;long long min;cin>>t;while(t--){read_graph();Dijkstra();min=d[site[0]];for(i=1;i<N;i++)if(d[site[i]]<min)min=d[site[i]];cout<<min<<endl;}}                                
多源对多源的Floyed算法,在这里会超时的,这个程序很好写,就是不停里往里面加入点,三个for循环.

for(i=1;i<=M;i++)for(j=1;j<=M;j++)for(k=1;k<=M;k++)if(map[j][k]>map[j][i]+map[i][k]){    map[j][k]=map[j][i]+map[i][k];   map[k][j]=map[j][i]+map[i][k]; }
真心写的很乱,忘完了