把最近做的幾道最短路一起總結一下吧
poj1062
中文題,不解釋題意,對於渣渣來說,是先看別人題解後才做的,以酋長的允諾作為目標點,每乙個物品與替換物之間會有一條邊,由於交換有限制,所以建完圖後,以每乙個點為終點或是說最高點,先遍歷一次,把不能交換或間接交換的點去掉,然後再進行最短路尋找。實際就是把所有可能都搞了一遍找最短
還有另一種解法,dp
接下來幾道題都是floyed
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
const
int inf=
0x7fffffff
;struct
pointt
p[205
];double dis[
205][
205];
double
dist
(pointt a,pointt b)
intmain
()/*for(int i=1;i<=n;i++)
*/for
(int k=
1;k<=n;k++)
for(
int i=
1;i<=n;i++)
for(
int j=
1;j<=n;j++)
/*for(int i=1;i<=n;i++)
*/ cout<<
"scenario #"
<'<<
"frog distance = "
<<
setiosflags
(ios::fixed)<<
setprecision(3
)<2]
}
poj1125
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
105][
105];
intmain()}
/* for(int i=1;i<=n;i++)
*/for
(int k=
1;k<=n;k++)
for(
int i=
1;i<=n;i++)
for(
int j=
1;j<=n;j++)
minint maxlen=
0x3f3f3f3f
,sorce;
for(
int i=
1;i<=n;i++)
if(maxlen1(maxlen==
0x3f3f3f3f
)cout<<
"disjoint\n"
cout<' '<}return0;
}
poj2240
也可以跟poj1860那樣去解
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
double dis[
35][
35];
const
double eps=
1e-12
;mapint>mp;
intmain
() cin>>m;
while
(m--)
for(
int k=
1;k<=n;k++)
for(
int i=
1;i<=n;i++)
for(
int j=
1;j<=n;j++)
if(dis[i][j]-dis[i][k]*dis[k][j]dis[i][j]=dis[i][k]*dis[k][j];
bool flag=
false
;for
(int i=
1;i<=n;i++)
}printf
("case %d: "
,r++);
if(flag)
printf
("yes\n"
);else
printf
("no\n"
);}return0;
}
關於最短路
模板 void dij p.push make pair d 1 1 while p.empty 為啥想到用最小堆?因為每次都是找與源點最近的,vis為0的點,想到了用優先佇列找的快一點細節 d陣列用pair形式表示,pair的first是距離,second是點的下標。pair跟結構體差不多,如果用...
關於最短路 1
我們可以把邊帶有權值的圖稱為帶權圖。邊的權值可以理解為兩點之間的距離。一張圖任意兩點間會有不同的路徑相連。最短路徑就是指連線兩點的這些路徑中最短的一條。我們有四種方法求出兩個點間最短的路徑 分別是floyed warshall演算法 簡稱floyed演算法 dijkstra演算法 bellman f...
最短路 最短路徑問題
題目描述 平面上有n個點 n 100 每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點直線的距離。現在的任務是找出從一點到另一點之間的最短路徑。input 共有n m 3行,其中 第一行為乙個整數n。第2行...