藉著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,更新它能到達且能更新的的點,然後將...