題意:這題關鍵是題意理解了就會做了。
大致題意:現在有一鐵路網路,有n個交叉點,和一些開關。通過開關可以改變路線方向,使其能駛向其他交叉點。
開關的初始狀態已知,即(初始直接某兩點直接相連)。a到b.
問從出發點到目的地最少要動多少開關才能到達。
分析:想想就會發現是最短路問題。假如要從1--3如果有直接連線的邊則不要動開關,如果要通過1-2,2-3則需要懂開關一次。這題就是找從出發點到目的地最少要動多少開關才能到達。
演算法:dijkstra||floyd都行。這裡用floyd,反正資料不大才100.不過要改下狀態方程。接存在的邊權設為0,間接相連的邊,其權設為1,那麼從出發點到目的地的最短路也就記錄了最少要用的開關數。
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]).
view code
//i'm lanjiangzhou//c
#include #include
#include
#include
#include
#include
//c++
#include #include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
//*************************output*************************
#ifdef win32
#define int64 "%i64d"
#define uint64 "%i64u"
#else
#define int64 "%lld"
#define uint64 "%llu"
#endif
//**************************constant***********************
#define inf 0x3f3f3f3f
#define eps 1e-8
#define pi acos(-1.)
#define pi2 asin (1.);typedef
long
long
ll;//
typedef __int64 ll;
//codeforces
typedef unsigned int
ui;typedef unsigned
long
long
ui64;
#define mp make_pairtypedef vector
vi;typedef pair
pii;
#define pb push_back
#define mp make_pair
//***************************sentence************************
#define cl(a,b) memset (a, b, sizeof (a))
#define sqr(a,b) sqrt ((double)(a)*(a) + (double)(b)*(b))
#define sqr3(a,b,c) sqrt((double)(a)*(a) + (double)(b)*(b) + (double)(c)*(c))
//****************************function************************
template double dis(t va, t vb)
template
inline t integer_len(t v)
template
inline t square(t va, t vb)
//aply for the memory of the stack
//#pragma comment (linker, "/stack:1024000000,1024000000")
//end
const
int maxn = 200
;int
dis[maxn][maxn];
intn,a,b;
void
floyd()}}
}int
main()
dis[i][i]=0
; }
intm;
for(int i=1;i<=n;i++)
else
if(j==1
) dis[i][x]=0
; }
}floyd();
if(dis[a][b]==inf)
else printf("
%d\n
",dis[a][b]);
}return0;
}
Floyd求最短路
傳送門 題意 給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,邊權可能為負數。再給定k個詢問,每個詢問包含兩個整數x和y,表示查詢從點x到點y的最短距離,如果路徑不存在,則輸出 impossible 資料保證圖中不存在負權迴路。輸入格式 第一行包含三個整數n,m,k 接下來m行,每行包含三個整...
Floyd求最短路
路徑矩陣 通過乙個圖的權值矩陣求出它的每兩點間的最短路徑矩陣。從圖的帶權鄰接矩陣a a i,j n n開始,遞迴地進行n次更新,即由矩陣d 0 a,按乙個公式,構造出矩陣d 1 又用同樣地公式由d 1 構造出d 2 最後又用同樣的公式由d n 1 構造出矩陣d n 矩陣d n 的i行j列元素便是i號...
AcWing Floyd求最短路 Floyd
時 空限制 1s 64mb 給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,邊權可能為負數。再給定k個詢問,每個詢問包含兩個整數x和y,表示查詢從點x到點y的最短距離,如果路徑不存在,則輸出 impossible 資料保證圖中不存在負權迴路。第一行包含三個整數n,m,k 接下來m行,每行包含三...