澳门新葡亰平台官网弗洛伊德算法

澳门新葡亰平台官网 1

Floyd-Warshall算法,简单称谓Floyd算法,用于求解大肆两点间的最短距离,时间复杂度为O(n^3卡塔尔。

样例能够通过,可是交给后展现运行超时使用scanner作为输入使用了队列用来囤积数据别的的只利用了着力的for循环和数组CCF答题语言选了个JAVA求各位大佬帮帮儿女尝试过使用BufferReader替代scanner不过照旧超时,也再百度上询问过别的措施尝试化解,可是都未中标代码:publicclassMain{publicstaticvoidmain(String[]args卡塔尔{//TODOAuto-generatedmethodstubScannerinput=newScanner(System.in卡塔尔国;intm,n;//m类开端状态每类中有n个m=input.nextInt(卡塔尔;n=input.nextInt(State of Qatar;things[]things=newthings[m];for(inti=0;im;i++){things[i]=newthings();}for(inti=0;in;i++){inta,b;a=input.nextInt();b=input.nextInt();thingc=newthing(a,b);for(intj=0;jm;j++){things[j].add(c卡塔尔;}}intr=input.nextInt(State of Qatar;//操作的次数intk=-1;//用来测算查询操作的次数Queueint[]queue=newLinkedListint[](卡塔尔国;for(inti=0;ir;i++卡塔尔(قطر‎{inta=input.nextInt(卡塔尔国;//选用操作if(a==1卡塔尔{//增添操作intb,id,score;//要参与的商的所属类、商品编号、得分b=input.nextInt(卡塔尔国;id=input.nextInt(卡塔尔;score=input.nextInt(卡塔尔(قطر‎;thingthing=newthing(id,scoreState of Qatar;things[b].add(thing卡塔尔国;}elseif(a==2State of Qatar{intb,id;//要刨除的货物的所属类、编号b=input.nextInt(卡塔尔;id=input.nextInt(State of Qatar;things[b].del(idState of Qatar;}elseif(a==3卡塔尔{//查找操作k++;intmax=input.nextInt(State of Qatar;intmmax=0;int[]cm=newint[m];for(intj=0;jm;j++){cm[j]=input.nextInt(卡塔尔;//用来记录各类类中要询问的个数}for(intj=0;jm;j++State of Qatar{mmax+=cm[j];}if(max=mmax){for(intj=0;jm;j++){int[]b=newint[cm[j]];b=things[j].findmax(cm[j]);queue.add(b);}}else{into=0;for(intj=0;jm;j++){if(o==max){o–;int[]b=newint[cm[j]];for(intq=0;qcm[j];q++){b[q]=-1;}queue.add(b);}else{int[]b=newint[cm[j]];b=things[j].findmax(cm[j]);queue.add(b);}o++;}}}}for(inti=0;i(k+1)*2;i++){int[]print=queue.poll();for(intj=0;jprint.length;j++){System.out.print(print[j]+””);}System.out.println();}//for(inti=0;im;i++){//things[i]澳门新葡亰平台官网,.show();//}}}classthing{intid;intscore;publicthing(intid,intscore){this.id=id;this.score=score;}}classthings{Queuethingqueue=newLinkedListthing();intn;publicthings(){//TODOAuto-generatedconstructorstub}publicvoidadd(thinga){queue.add(a);}voiddel(intid){for(inti=0;iqueue.size();i++){thinga=queue.poll();if(a.id==id){break;}else{queue.add(a);}}}int[]findmax(intnum){intmax[]=newint[num];int[]p=newint[queue.size()];for(inti=0;iqueue.size(卡塔尔国;i++卡塔尔国{//将得分传入三个数组thinga=queue.poll(卡塔尔;p[i]=a.score;queue.add(a卡塔尔;}for(inti=0;iqueue.size(卡塔尔-1;i++卡塔尔{//使用冒泡排序将得分实行排序for(intj=0;jqueue.size(卡塔尔-i-1;j++卡塔尔国{if(p[j]p[j+1]){inttemp=p[j];p[j]=p[j+1];p[j+1]=temp;}}}Queuethingtem=newLinkedListthing();for(inti=0;ip.length;i++){for(intj=0;jqueue.size();j++){thinga=queue.poll();if(a.score==p[i]){tem.add(a);}else{queue.add(a);}}}queue=tem;for(inti=0;inum;i++){thinga=queue.poll();max[i]=a.id;queue.add(a卡塔尔国;}returnmax;}voidshow(卡塔尔{//遍历效用输出每叁个数量for(inti=0;iqueue.size(State of Qatar;i++State of Qatar{thinga=queue.poll(卡塔尔;System.out.println(a.id+””+a.score卡塔尔;queue.add(a卡塔尔(قطر‎;}}}

用来估测计算从多少个点到其余全体一点的最短路线的算法,是一种单源最短路线算法。也便是说,只好总结源点独有八个的情景。

运用口径约束

Dijkstra的光阴复杂度是O (N2卡塔尔国,它无法管理存在负边权的景况。

平铺直叙能够在别的图中运用,包括有向图、带负权边的图。

算法描述:

Floyd-Warshall
算法用来寻找每对点时期的最短间距。它必要用邻接矩阵来储存边,这一个算法通过思考最好子路线来博取最好路径。

      
设起源为s,dis[v]表示从s到v的最短路线,pre[v]为v的先辈节点,用来输出路线。

算法观念

       a)初始化:dis[v]=∞(v≠s); dis[s]=0; pre[s]=0;

Algorithm代码

       b)For (i = 1; i <= n ; i++)

//dist(i,j卡塔尔国为从节点i到节点j的最短间距

            1.在未有被访谈过的点中找叁个极点u使得dis[u]是纤维的。

Fori←1tondo

            2.u标识为已规定最短路线

Forj←1tondo

            3.For 与u相连的每一个未规定最短路线的极点v

dist(i,j)=weight(i,j)

              if  (dis[u]+w[u][v]<dis[v])

Fork←1tondo//k为“媒介节点”

               {

Fori←1tondo

                  dis[v]=dis[u]+w[u][v];

Forj←1tondo

                  pre[v]=u;

if(dist(i,k卡塔尔(قطر‎+dist(k,j卡塔尔(قطر‎dist(i,j卡塔尔卡塔尔国then//是还是不是是更加短的门径?

               }

dist(i,j)=dist(i,k)+dist(k,j)

       
c卡塔尔算法甘休:dis[v]为s到v的最短间隔;pre[v]为v的前任节点,用来输出路线。

实现

算法达成步骤:

Java代码

   
设图G用邻接矩阵的点子存款和储蓄在GA中,GA[I,j]=maxint代表vi,vj是不关乎的,不然为权值(大于0的实数)。设集结s用来保存已求得的最短路线的极端序号,开头时s=[vi]意味着除非源点,以往每求出三个极端vj就把它参预到聚聚集并作为新设想的中档结点。

publicclassFloyd{

   
设数组dist[1..n]用来囤积当前求得的最短路线,起头时vi,vj借使是事关的,则dist[j]=权值,不然=maxint,未来,随着思考的上游结点越多,dist[j]恐怕更进一层小。再设二个与dist数组相对应的数组path[1..n],用path[j]来存放在当前vi-vj的最短路线上vj点的先驱者,伊始时为vi的边,要是不设有边,则为0。

privateint[][]dist;

   
实践时,先从s以外的终点(即待求出最短路线的终端)所对应的dist数组成分中,寻找其值最小的成分(就算为dist[m]),该因素的值便是从起源vi到极点vm的最短路线长度,从对应的path[m]中的顶点开头递归直到源点的种类即为最短路线。接着把vm并入会集s中,然后以vm作为新虚构的中间结点,对s以外的种种终端vj,相比dist[m]+GA[m,j]和dist[j]的朗朗上口,若前面一个小,申明参与中间结点后能够拿走越来越好的方案,就能够求得越来越短的路子,那么就用dist[m]+GA[m,j]代替他原先的dist[j],同时把vm存入到path[j]中。重复以上n-2次,就可以在dist数组取得从起点到任何各终点的最短路线长度,对应的path数组中保存着相应的最短路线的顶峰四驱。

privateint[][]path;

算法推行进度图示分析:

publicvoidfloyd(int[][]value){

   澳门新葡亰平台官网 1

intlen=value.length;

dist=newint[len][len];

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 int map[1000][1000];
 6 int vis[1000];
 7 int dis[1000];
 8 int path[1000];
 9 int n,m,w;
10 int e;
11 const int maxn=999999;
12 void df(int);
13 void print(int, int);
14 int main()
15 {
16     cin>>n>>m;
17     memset(dis,maxn,sizeof(dis));
18     memset(map,maxn,sizeof(map));
19     for(int i=1;i<=m;i++)
20      {
21          int x,y;
22          cin>>x>>y>>w;
23          map[x][y]=map[y][x]=w;
24      }
25     memset(vis,0,sizeof(vis));
26     int a;
27     cin>>a>>e;
28     df(a);
29     print(a,e);
30 } 
31 void df(int s)
32 {
33     for(int i=1;i<=n;i++)
34      {
35          dis[i]=map[s][i];
36          if(dis[i]!=maxn)
37           {
38               path[i]=s;
39           }
40         else path[i]=0;
41      }
42      vis[s]=1;
43      dis[s]=0;
44      int k,min1;
45      for(int i=1;i<=n-1;i++)
46       {
47           k=s;
48           min1=maxn;
49           for(int j=1;j<=n;j++)
50            {
51                if(dis[i]<min1&&vis[j]==0)
52                 {
53                     min1=dis[i];
54                     k=j;
55                 }
56            }
57            vis[k]=1;
58            for(int q=1;q<=n;q++)
59             {
60                 if(vis[q]==0&&dis[q]>dis[k]+map[k][q])
61                  {
62                      dis[q]=dis[k]+map[k][q];
63                      path[q]=k;
64                  }
65             }
66       }
67       cout<<dis[e]<<" ";
68 }
69 void print(int u,int r)
70 {
71     int que[1000];
72     int tot=1;
73     int temp;
74     que[tot]=r;
75     tot++;
76     temp=path[r];
77     while(temp!=u)
78      {
79          que[tot]=temp;
80          tot++;
81          temp=path[temp];
82      }
83      que[tot]=u;
84      for(int i=tot;i>=1;i--)
85       {
86           cout<<que[i]<<"-->"; 
87       }
88 }

path=newint[len][len];

 

for(inti=0;ilen;i++){

             
             
             

for(intj=0;jlen;j++){

path[i][j]=-1;

dist[i][j]=value[i][j];

}

}

for(intk=0;klen;k++){

for(inti=0;ilen;i++){

for(intj=0;jlen;j++){

if(dist[i][k]!=Integer.MAX_VALUE

dist[k][j]!=Integer.MAX_VALUE

dist[i][k]+dist[k][j]dist[i][j]){

dist[i][j]=dist[i][k]+dist[k][j];

path[i][j]=k;

}

}

}

}

}

publicvoidpath(inti,intj){

intk=path[i][j];

if(k==-1)

return;

path(i,k);

System.out.print(-+k);

path(k,j);

}

publicvoiddisPatch(inti,intj){

System.out.println(mindistis:+dist[i][j]);

System.out.print(i);

path(i,j);

System.out.print(-+j);

}

}

dist[][]数组初叶化为各极点间的本原间距,最终存款和储蓄各极点间的最短间距。

path[][]数组保存最短路线,与最近迭代的次数有关。起头化都为-1,表示并未有中间极点。在求dist[i][j]过程中,path[i][j]存放从巅峰vi到终极vj的高级中学级极点编号一点都不大于k的最短路线上前二个结点的编号。在算法甘休时,由二维数组path的值回溯,能够赢得从顶峰vi到顶峰vj的最短路径。

You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图