tyvj 1196:
因為點只有20個,用搜尋就可以過,但是需要減枝一下,就是當當前計算的總距離大於已經記錄的最小距離和還有大的時候,這種情況可以直接剪掉。
還有乙個地方需要注意,在寫的時候沒注意到錯了好幾次。就是在搜尋過程中i迴圈一次以後就要break,因為這題是在列舉各種組合情況,所以(a, b)(c, d)和(c, d)(a, b)其實是一樣的,就不需要再重複計算。
比如說有四個點1, 2, 3, 4
程式會先搜到(1, 2)(3, 4)這種情況,如果不break的話,繼續往下搜就會出現9(3, 4)(1, 2)的情況。
#include #include #include struct node
;node p[30];
int n;
double ans, dis[30][30];
bool vis[30];
double f(node a, node b)
void dfs(int c, double s)
for(i = 0; i < n; i++)
}vis[i] = 0;
break;//注意這個break,保證在以後搜的情況之前沒有搜到過,這裡是組合不是排列
} }}int main (void)
} dfs(0, 0.0);
printf("%.2lf\n", ans);
} return 0;
}
BZOJ 1196 貪心 最小生成樹
這道題我們可以貪心,首先按建一級公路的花費從小到大排序,然後用最小生成樹的做法選出k條並做好標記,然後再按建一級公路和建二級公路的花費的最小值排序,再做一遍最小生成樹,更新答案。這樣做的正確性是因為先加入了有用的k條一級公路,並且滿足這些公路最大值最小,然後又按照最小生成樹的方法加邊,又滿足後加入的...
TYVJ 1307 聯絡員(最小生成樹)
kruskal裸題。水題紅色警報 include include include include include include using namespace std define rep i,n for int i 0 i define for1 i,a,n for int i a i n i ...
015拼多多 兩兩配對差值最小
問題描述 給定乙個長度為偶數的陣列arr,將該陣列中的數字兩兩配對並求和,在這些和中選出最大和最小值,請問該如何兩兩配對,才能讓最大值和最小值的差值最小?輸入描述 一共2行輸入。第一行為乙個整數n,2 n 10000,第二行為n個數,組成目標陣列,每個數大於等於2,小於等於100。輸出描述 輸出最小...