最短路演算法總結

2021-06-23 02:02:08 字數 1237 閱讀 8400

藉著usaco 3.26搞了幾天最短路。。

不得不說usaco真是菜鳥學習演算法的利器啊,有資料可以查錯。。

題上是乙個800*800的稀疏圖,需要求全源最短路

先用floyd試了一下。。畢竟就三行,很好寫。。時間o(n3),裸交第九個點果然tle了,不過看題解有人水過了

就把邏輯語言改了一下,無向圖時間又可以優化到1/2.。。交了一發900ms 水過。。。

for(k=1;k<=p;k++)

for(i=1;i<=p;i++)

node;

typedef struct head

head;

head h[801];

node *e[801];

void makeheapdown(int i1,int n)

if(rdist[heap[r]])

if(mm==i1)

return;

swap(heap[i1],heap[mm]);

swap(inh[heap[i1]],inh[heap[mm]]);

makeheapdown(mm,n);

}void makeminheap(int n)

int main (void)

for(i=1;i<=800;i++)

for(i=1;i<=n;i++)

for(i=1;i<=c;i++)

ans=max;

for(i=1;i<=p;i++)

for(int ii=1;ii<=p;ii++)

for(node *ii=h[i].next;ii!=e[i];ii=ii->next)

vi[i]=1;

dist[i]=0;

makeminheap(size);

while(size)

node;

node edge[3000];

int main (void)

memset(head,0,sizeof(head));

for(i=0;ileft)

else

q[right++]=edge[ii].en;}}

} for(int ii=1;ii<=p;ii++)

sum+=dist[ii]*cow[ii];

ans=min(ans,sum);

} printf("%d\n",ans);

return 0;

}



最短路演算法總結

1.floyd演算法 n 3複雜度 基本思想 開始設集合s的初始狀態為空,然後依次將0,1,n 1定點加入,同時用d i j 儲存從i到j,僅經過s中的定點的最短路徑,在初始時刻,d i j a i j 中間不經過任何節點,然後依次向s中插入節點,並進行如下更新 d k i j min 還可以使用乙...

最短路演算法總結

dijkstra演算法 dijkstra 迪傑斯特拉 演算法是典型的單源最短路徑演算法,用於計算乙個節點到其他所有節點的最短路徑。最常見的問題就是 給你一張地圖,讓你求出指定的點到其餘各定點的最短路徑。演算法核心 每次找到離源點最近的乙個頂點,然後以該頂點為中心進行擴充套件,最終的到源點到其餘所有點...

最短路演算法總結

顧名思義就是尋找乙個源點到其它的點的最短路,暴力的dfs或者bfs就不說了,下面講講幾種單源最短路的演算法。這個演算法的實質就是利用bfs,我們先將源點到源點的距離設定為0,到其它的距離設定為無窮大 一般0x7fffffff 然後將源點加入佇列,用隊首的點去bfs,更新它能到達且能更新的的點,然後將...