POJ 3464 最短路徑與次短路徑的條數

2021-06-01 19:57:39 字數 1506 閱讀 1673

幾天沒有做題了。想好好的整合一下知識。不然的話真的採用題海戰術這樣絕對是不明智的!

鄙人目前對圖論,組合數學,計算幾何感興趣。dp還好~

做題做了一道次短路徑的題。以前也想過這樣的解法並且也還碼過**,很明顯的wa了。

這次借鑑了網上的做法,並個人做了認真的思考。看來我對dij的演算法理解還是不是很深啊!雖然通過yy,想出了最短路徑條數的計算方法,次短路徑卻怎麼也解決不了。

研究過大神的演算法後,好不容易總算是理解了。

這樣對於圖,開兩個維度的cnt,vis,dis分別計算路徑的條數,是否訪問,單源點距離。首先對dis陣列進行遍歷,找到兩個維度中的最小值。同時對提供該最小值的響應維度頂點採取拜訪過標記。這樣用dij去更新陣列的時候就可以更新不同的維度了。另外呢這樣會出現4種情況需要更新距離的:

在三角距離公式中dis[v]>min+w;

1.比最短路徑維度的最短路徑還要短:明顯的最短路徑要更新了,所以到該點的最短路徑和條數在更新後就變成了次短路徑了,這是明顯的。所以對次短路徑及條數進行儲存,最短路徑和條數進行更新。

2.和最短路徑維度的最短路徑相等:這樣不要更新最短路,但是由上乙個點到該點的路徑增多了,所以將上一條路徑的到達條數流到自己身上來。

3.比次短路徑維度的最短路徑要短:這時明顯的比最短路徑要長,所以對次短路徑進行更新。同時到達路徑數修改為上一點流過來的路徑數。

4.和次短路徑維度的最短路徑相等:將到達路徑的點流到自己身上。這樣就好了。

這樣總結一番後發現,嗯~ 很有道理啊!

圖論 大愛啊~

#include#define maxe 10005

#define maxv 1005

using namespace std;

struct node

edge[maxe],*ptr[maxv];

int cnt[maxe][2],dis[maxe][2];

bool vis[maxe][2];

int e,v,s,f;

void addedge( int u,int v,int pri,int i )

void dijstra( int s )

else if( !vis[j][1] && min>dis[j][1] )

}if( k==-1 ) break;

vis[k][flag]=true;

node *p=ptr[k];

while( p )

else if( dis[p->v][0]==min+p->len )

else if( dis[p->v][1]>min+p->len )

else if( dis[p->v][1]==min+p->len )

p=p->next;}}

return ;

}int main()

{ int t;

scanf( "%d",&t );

while( t-- )

{scanf( "%d %d",&v,&e );

int i,j,u,v,p;

for( i=0;i

POJ 最短路徑

這兩天做了六道最短路徑的問題,分別用了dijkstra演算法 spfa演算法和floyd演算法,甚至還有一道題用並查集做的也a了,感覺對短路徑已經學得很不錯了。poj1860,poj3259,poj1062,poj2253,poj1125,poj2240 poj2253,dijkstra和並查集都可...

POJ 3463 最短路 次短路

本題是求最短路和比最短路距離長1的次短路的個數,於是就用到了dijkstra 主要的改變就是陣列都開到了二維,第二維用來表示是最短路還是次短路 比如d陣列和vis陣列 而cnt陣列使用來訪問最短路和次短路的次數 那麼最外層的迴圈就要到2 n 1次了,其中n 1次是用來求最短路的,還有n次是次短路的 ...

Codeup最短路徑 最短路徑

n個城市,標號從0到n 1,m條道路,第k條道路 k從0開始 的長度為2 k,求編號為0的城市到其他城市的最短距離。第一行兩個正整數n 2 n 100 m m 500 表示有n個城市,m條道路,接下來m行兩個整數,表示相連的兩個城市的編號。n 1行,表示0號城市到其他城市的最短路,如果無法到達,輸出...