洛谷P1690 貪婪的Copy

2021-08-10 13:38:15 字數 1332 閱讀 1202

copy從盧牛那裡聽說在一片叫yz的神的領域埋藏著不少寶藏,於是copy來到了這個被劃分為個區域的神地。盧牛告訴了copy這裡共有個寶藏,分別放在第pi個(1<=pi<=n)區域。copy還得知了每個區域之間的距離。現在copy從1號區域出發,要獲得所有的寶藏並到n號區域離開。copy很懶,只好來找你為他尋找一條合適的線路,使得他走過的距離最短。

輸入格式:

第一行乙個正整數n(1<=n<=100)

接下來乙個n*n的矩陣,第i+1行第j列的數字表示區域i,j之間的距離。每個距離用空格隔開,距離保證i,j<=1000。請注意的i to j距離並不一定等於j to i的距離。

第n+2行乙個整數p(0<=p<=10)。

第n+3行共p個用空格隔開的整數,表示有寶藏的區域編號。

輸出格式:

乙個整數,為copy獲得全部寶藏需要的最短距離。資料保證答案小於等於maxlongint。

輸入樣例#1:

樣例輸入1

20 4

5 02

1 2樣例輸入2

30 2 6

1 0 4

7 10 0

12

輸出樣例#1:

樣例輸出1

4樣例輸出1

6

對30%的資料,1<=n<=15,其餘如題所述。

對100%的資料,全部資料範圍如題所述。

模擬賽做太多,自信心都沒了。。。

只好做水題了。。。最短路,二話不說 floyd 。。。

注:stl **好。。。

附**:

#include#include#include#define max 999999999

#define maxn 110

using namespace std;

int n,q,ans=2147483646,num[maxn],a[maxn][maxn];

inline int read()

while(c>='0'&&c<='9')

return date*w;

}void floyd()

int main(){

int x;

n=read();

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

for(int j=1;j<=n;j++)

a[i][j]=read();

floyd();

q=read();

for(int i=1;i<=q;i++)num[i]=read();

sort(num+1,num+q+1);

do{int s=a[1][num[1]]+a[num[q]][n];

for(int i=1;i

洛谷P1690 貪婪的Copy 題解

這道題就是一道最短路的題目,因為看到資料範圍 n 100 n leq100 n 10 0 所以考慮使用flo yd floyd floyd 我們先用o n 3 o n 3 o n3 的時間複雜度來跑一遍flo yd floyd floy d,然後考慮每個藏寶點,發現藏寶點p的範圍 p 10 p le...

洛谷P1690 貪婪的Copy 題解

這道題就是一道最短路的題目,因為看到資料範圍 n 100n leq100n 100 所以考慮使用floydfloydfl oyd 我們先用o n3 o n 3 o n3 的時間複雜度來跑一遍floydfloydfl oyd,然後考慮每個藏寶點,發現藏寶點p的範圍 p 10p leq10p 10我們可...

洛谷P1690 貪婪的Copy 題解

這道題就是一道最短路的題目,因為看到資料範圍 n 100n 100 所以考慮使用flo ydfl oyd我們先用o n 3 o n3 的時間複雜度來跑一遍flo ydfl oyd,然後考慮每個藏寶點,發現藏寶點p的範圍 p 10p 1 0我們可以考慮所有情況的窮舉,所以說是乙個數列的全排列,最多隻需...