專題訓練2 最短路

2021-10-08 18:51:18 字數 4156 閱讀 1588

floyed演算法(o(n^3))

dijkstra (適合稠密圖)

spfa:優點是可以處理負權值,但是不能處理負環,使用前最好先判斷是否有負環(適合稀疏圖)(還不熟)*

會用到的存圖方法:

鄰接矩陣

鄰接表前向星(待學)

1.mpi maelstrom poj1502 (無向圖)

題目在此

一開始看錯了題意,以為需要對所有dis求和,實際上只需要取最大值

stoi不能用,可以用atoi(char*轉化成int)

**:

#include

#include

#include

#include

#include

#include

using

namespace std;

const

int max =

105;

const

int inf =

0x3f3f3f

;int n,ans;

int dis[max]

;//表示從起點到i的最短距離

bool vis[max]

;//vectorv[max];

int adj[max]

[max]

;int x, mindis;

void

init()

*/for

(int i =

1; i <= n; i++)}

dis[1]

=0;}

intmain()

}}for(

int i =

1; i <= n; i++)}

vis[x]=1

;for

(int j =

1; j <= n; j++)}

}for

(int i =

1; i <= n; i++

) cout << ans << endl;

return0;

}

2.cow contest poj3660 (floyed演算法)

題目在此

看了一眼題解豁然開朗,用floyed鬆弛

用memset只適合置0/-1/0x3f3f3f3f

**:

#include

#include

#include

#include

#include

#include

using

namespace std;

const

int max =

105;

const

int inf =

0x3f3f3f

;int adj[max]

[max]

;int

main()

}int n, m;

cin >> n >> m;

for(

int i =

1; i <= m; i++

)for

(int j =

1; j <= n; j++)}

}}int ans =0;

for(

int i =

1; i <= n; i++)if

(sum == n -1)

//和其他所有牛都能比較,他就贏了

ans++;}

cout << ans << endl;

return0;

}

3.tram poj1847

只要能看出是最短路就比較簡單,不搬開關權值是0,搬開關權值是1

題目在此

**:

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

const

int max =

105;

const

int inf =

0x3f3f3f3f

;int adj[max]

[max]

,dis[max]

,ans,n;

bool vis[max]

;int x, mindis,a,b;

struct node

;vector mp[max]

;void

init()

dis[a]=0

;memset

(adj, inf,

sizeof

(adj));

}int

main()

}for

(int i =

1; i <= n; i++)}

vis[x]=1

;for

(int j =

1; j <= n; j++)}

}if(dis[b]

== inf)

puts

("-1");

else

cout << dis[b]

<< endl;

return0;

}

4.silver cow party poj3268

**在此

**:

#include

#include

#include

#include

#define max 1005

const

int inf =

0x3f3f3f

;using

namespace std;

int adj[max]

[max]

, dis[max]

, ret[max]

;int a[max]

, b[max]

;bool vis[max]

;void

init

(int n,

int x)

dis[x]=0

; ret[x]=0

;}intmain()

}//城鎮數,路數,party城

for(

int i =

1; i <= m; i++

)/*for (int i = 1; i <= n; i++)

cout << endl;

} cout << endl << endl;*/

for(

int i =

1; i <= n; i++)}

vis[t]=1

;for

(int j=

1;j<=n;j++)}

for(

int i =

1; i <= n; i++

) a[x]=0

;//a表示從x回來的距離

//到此為止正過程結束

for(

int i =

1; i <= n; i++)}

init

(n, x)

;/*for (int i = 1; i <= n; i++)

cout << endl;

}*/for(

int i =

1; i <= n; i++)}

vis[t]=1

;for

(int j =

1; j <= n; j++)}

for(

int i =

1; i <= n; i++

) b[x]=0

;int ans =0;

for(

int i =

1; i <= n; i++

) cout << ans << endl;

return0;

}

演算法訓練 最短路

問題描述 給定乙個n個頂點,m條邊的有向圖 其中某些邊權可能為負,但保證沒有負環 請你計算從1號點到其他點的最短路 頂點從1到n編號 輸入格式 第一行兩個整數n,m。接下來的m行,每行有三個整數u,v,l,表示u到v有一條長度為l的邊。輸出格式 共n 1行,第i行表示1號點到i 1號點的最短路。樣例...

訓練 最短路 01

time limit 1000msmemory limit 32768kb64bit io format i64d i64u description 某省自從實行了很多年的暢通工程計畫後,終於修建了很多路。不過路多了也不好,每次要從乙個城鎮到另乙個城鎮時,都有許多種道路方案可以選擇,而某些方案要比另...

演算法訓練 最短路

最近在學習一些常見的演算法,演算法這東西不練是不行的,所以學習的同時也找了些題來練。我找的題目 於 vjudge 上的 kuangbin帶你飛專題訓練。每做完乙個專題,我都會寫一篇部落格整理一下這個專題。現在這個專題是,圖論中的最短路。最短路相關的演算法有很多,在專題訓練中會用到的有 dijkstr...