2017 8 27 魔法王國

2021-08-07 14:10:25 字數 1530 閱讀 6520

【輸入格式】

輸入檔案的第一行包含整數n,m,a1,b1,a2,b2。這裡n(3 <= n <=100)是王國裡的城市數(城市從1到n標號);m(2 <= m <= 1000)是魔法門的個數;是相鄰的城市,對應的分別是albert和betty的出發城市;也是相鄰的城市,對應的分別是albert和betty希望到達的城市。

接下來的m行描述魔法門。每一行包含兩個數pi1和pi2——用魔法門相連的城市。任意兩個城市之間最多只有乙個魔法門連線。

【輸出格式】

輸出檔案的第一行包含兩個用乙個空格隔開的整數c。這裡c是方案中最少的移動次數;

【輸入樣例】kingdom.in

4 5 1 2 2 1

1 2

2 3

3 4

4 1

1 3【輸出樣例】kingdom.out

3【分析】

大家看完題目,就會發現這是一道最短路問題。但是,題目中最短路的起點和終點是一對城市,而且他們在旅行的過程中,兩人也必須在相鄰的城市。如果直接跑一遍最短路是肯定不行的。仔細分析題目,發現他們經過的城市都是相鄰的。這樣我們可以把每對相鄰的城市都看作乙個點,這樣共有2m個點。接下來要確定每兩點之間的距離,有3種情況:

1. 這兩對相鄰城市中,第乙個城市相同,第二個城市聯通,邊權為1;

2. 這兩對相鄰城市中,第二個城市相同,第乙個城市聯通,邊權為1;

3. 這兩對相鄰城市中,兩個城市都聯通,邊權為2;

做完這些之後,跑一遍最短路即可。

本人略醜的**<-_->

#include

#include

#include

#include

#include

#include

#include

#define for(c,a,b) for(int c=a;c<=b;c++)

#define for(c,a,b) for(int c=a;c>=b;c--)

using

namespace

std;

const

int n=405;

int n,m,a1,a2,b1,b2,x[n],y[n];

int f[n][n],g[n][n],tot;

int main()

memset(f,0x3f,sizeof(f));

for(i,1,tot-1) for(j,i+1,tot)

for(k,1,tot) for(i,1,tot)

if (k!=i) for(j,1,tot)

if (k!=j&&i!=j)

f[i][j]=min(f[i][j],f[i][k]+f[k][j]);

//floyed可能會超時,可能是資料水

//建議用時間複雜度低於o(m^2)的演算法

printf("%d\n",f[g[a1][a2]][g[b1][b2]]);

fclose(stdin); fclose(stdout);

return

0;}

遊歷魔法王國

魔法王國一共有n個城市,編號為0 n 1號,n個城市之間的道路連線起來恰好構成一棵樹。小易現在在0號城市,每次行動小易會從當前所在的城市走到與其相鄰的乙個城市,小易最多能行動l次。如果小易到達過某個城市就視為小易遊歷過這個城市了,小易現在要制定好的旅遊計畫使他能遊歷最多的城市,請你幫他計算一下他最多...

網易 遊歷魔法王國

魔法王國一共有n個城市,編號為0 n 1號,n個城市之間的道路連線起來恰好構成一棵樹。小易現在在0號城市,每次行動小易會從當前所在的城市走到與其相鄰的乙個城市,小易最多能行動l次。如果小易到達過某個城市就視為小易遊歷過這個城市了,小易現在要制定好的旅遊計畫使他能遊歷最多的城市,請你幫他計算一下他最多...

遊歷魔法王國(網易)

時間限制 1秒 空間限制 32768k 魔法王國一共有n個城市,編號為0 n 1號,n個城市之間的道路連線起來恰好構成一棵樹。小易現在在0號城市,每次行動小易會從當前所在的城市走到與其相鄰的乙個城市,小易最多能行動l次。如果小易到達過某個城市就視為小易遊歷過這個城市了,小易現在要制定好的旅遊計畫使他...