hdu 5418 Victor and World
阿新 • • 發佈:2022-11-29
hdu 5418 Victor and World
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/131072 K (Java/Others)
連結:http://acm.hdu.edu.cn/showproblem.php?pid=5418
Victor now is at the country whose number is 1
In every test case, there are two integers n and m in the first line, denoting the number of the countries and the number of the flights.
Then there are m
1≤T≤20.
1≤n≤16.
1≤m≤100000.
1≤wi≤100.
1≤ui,vi≤n. Output Your program should print T lines : the i-th of these should contain a single integer, denoting the minimal amount of fuel for Victor to finish the travel. Sample Input 1 3 2 1 2 2 1 3 3 Sample Output 10
題意:有n個城市,在n個城市之間有m條雙向路,每條路有一個距離,現在問從1號城市去遊覽其它的2到n號城市最後回到1號城市的最短路徑(保證1可以直接或間接到達2到n)。(n<=16)
題解:狀壓DP,
#include <bits/stdc++.h> using namespace std; const int maxn = 20, maxm = 8e4; int mp[maxn][maxn], dp[maxm][maxn]; int main(){ int T; scanf("%d",&T); while(T--){ int n, m, ans = 100000008; scanf("%d%d",&n,&m); memset(mp, 0x3f, sizeof(mp)); for(int i = 1; i <= m; i++){ int u,v,w; scanf("%d%d%d",&u,&v,&w); mp[u][v] = mp[v][u] = min(mp[u][v], w);//! } for(int i = 1; i <= n; i++)mp[i][i] = 0; for(int k = 1; k <= n; k++) for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) if(i != j) mp[i][j] = min(mp[i][k] + mp[k][j], mp[i][j]); memset(dp, 0x3f, sizeof(dp)); dp[1][1] = 0; for(int s = 0; s <= (1<<n) - 1; s++) for(int i = 1; i <= n; i++) for(int k = 1; k <= n; k++){ if(!(s & (1<<(i-1))))continue; if(s & (1<<(k-1)))dp[s][i] = min(dp[s^(1<<(i-1))][k] + mp[k][i], dp[s][i]); } for(int i = 1; i <= n; i++)ans = min(ans , dp[(1<<n)-1][i] + mp[i][1]); printf("%d\n",ans); } }View Code