9月21日,今天是pink的生日,飄飄乎居士當然要去別人的領土大鬧一番啦!
為了收集更多的能量到pink家大鬧,飄飄乎居士準備從後花園中取出自己多年積攢的p個能量塊。後花園一共被劃分n個地區,能量塊被分散在裡面,現在飄飄乎居士拿出地圖,發現自己站在1的地方,而他要做的就是用最短的路程把所有的能量塊取出,並且最後走到位於n的出口處,而飄飄乎居士一直是個懶人,他想知道最少要走多少路程才能夠取到所有的能量塊,並且走到出口
第一行乙個正整數n,表示花園被劃分成了n個地區
接下來乙個n*n的矩陣,代表個點之間的相互距離,資料保證從i走到i沒有路程
在下來乙個整數p,表示一共有p個能量塊
接下來一行,表示各個能量塊的位置,資料保證1和n沒有能量塊,且每個地區最多乙個能量塊
對於所有的資料 0乙個數,飄飄乎居士所要行走的最小距離
//搜尋 全排列 ↑題名字真詭異
#include#include#include#includeusing namespace std;
int n,p;
int a[200][200];//鄰接表
int pos[50];//能量塊位置
int minda=9999999;//儲存最優解
int sum=0;
int main()
scanf("%d",&p);
for(i=1;i<=p;i++)scanf("%d",&pos[i]);//讀入能量塊位置
//floyd演算法求最短距離
int k;
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(a[i][j]>a[i][k]+a[k][j])
a[i][j]=a[i][k]+a[k][j];
//以上
pos[0]=1;
sort(pos+1,pos+p+1);//從小到大排序能量塊位置,很神奇,加了這句話就ac
//後面函式可能不生效(p不夠大時),所以先算一遍
sum=0;
for(i=1;i<=p;i++)
sum+=a[pos[p]][n];
if(minda>sum)minda=sum;
//while(next_permutation(pos+1,pos+p+1))
sum+=a[pos[p]][n];
if(minda>sum)minda=sum;
}cout總之就是要最短路徑遍歷1區,n區,每個能量塊所在的區
這個next_permutation函式簡直好用,省了一番功夫
不用的話,還得自己寫乙個dfs求全排列
原本的思路是把所有能量塊位置+1點+n點一起構成乙個新的圖,之後發現並不需要,直接在原有a圖里做即可
↑另外構建新圖可能會導致一些不必要的資料錯位
12 8 8 可見與隱藏
1 超出範圍 overflow屬性 1.visble 表示層的大小和內容都會自動顯示出來 2.auto 表示在只在內容超出層的範圍時才顯示滾動條 3.hidden 表示會隱藏超出層範圍的內容 4.scroll 表示從事顯示滾動條。2 可見屬性 visibility 1.inherit 表示繼承父物件...
1288 幸運轉盤(一)
傳說中每乙個人都有乙個幸運轉盤,在人生的某些特殊時刻,我們會在睡夢中 良好睡眠哦 悄悄的轉動自己的幸運轉盤,轉盤的結果會影響著自己的心情,並改變自己的命運。現在到你旋轉幸運轉盤的時候了,你有乙個m m的轉盤,並且有t次機會轉動它,每一次轉動,你可以選擇它的轉動方向,並讓它相對於上一次轉動一定的角度。...
tyvj 叢林探險
東非大裂谷中有一片神秘的叢林,是全世界探險家的樂園,著名黃 探險家bb一直想去試試。正好我國科學家2005年4月將首次對東非大裂谷進行科考,bb決定隨科考隊去神秘叢林探險。在出發之前,他蒐集了國內外有關神秘叢林探險的資料,並繪製成一張地圖 該地圖上有若干安全點 包括入口點和出口點 並將這些安全點編號...