[題目鏈結]
[演算法]
首先,用dijkstra演算法求出2-k+1到每個點的最短路
然後,我們用f[s][i]表示目前停留城市集合為s,現在在城市i,最短的路徑
狀壓dp即可
[**]
#includeusingnamespace
std;
#define maxn 20010
#define maxm 200010
#define maxk 25
const
int inf =2e9;
const
int maxs = 1
<< 20
;int
i,j,x,n,m,k,u,v,w,tot,g,ts,ans,mask;
inthead[maxn],s[maxk];
intdist[maxk][maxn],f[maxs][maxk];
bool
visited[maxn];
struct
edge
e[maxm
<< 1
];inline
void addedge(int u,int v,intw);
head[u] =tot;
}inline
void dijkstra(int
s) dist[s][s] = 0
; q.push(make_pair(
0,s));
while (!q.empty())}}
}int
main()
scanf("%d
",&g);
for (i = 1; i <= g; i++)
for (i = 1; i <= k + 1; i++) dijkstra(i);
mask = (1
<< k) - 1
;
for (i = 0; i <= mask; i++)
}for (i = 2; i <= k + 1; i++)
f[0][1] = 0
;
for (i = 0; i <= mask; i++)
}
}ans =inf;
for (i = 1; i <= k + 1; i++) ans = min(ans,f[mask][i] +dist[i][n]);
printf(
"%d\n
",ans);
return0;
}
POI2007 旅遊景點atr BZOJ1097
分析 我們可以考慮,因為我們必須經過這些節點,那麼我們可以將它狀壓,並且我們因為可以重複走,只是要求停頓前後,不要求遍歷前後,那麼我們之間存一下點與點之間的最短路,之後每次轉移一下就可以了。f i s 表示在i節點,狀態為s,轉移 f i s maxe n 20 int head n cnt,f m...
bzoj1097 POI2007 旅遊景點atr
description fgd想從成都去上海旅遊。在旅途中他希望經過一些城市並在那裡欣賞風景,品嚐風味小吃或者做其他的有趣 的事情。經過這些城市的順序不是完全隨意的,比如說fgd不希望在剛吃過一頓大餐之後立刻去下乙個城市登山,而是希望去另外什麼地方喝下午茶。幸運的是,fgd的旅程不是既定的,他可以在...
楊柳青旅遊景點 天津西青旅遊景點精選推薦
天津西青旅遊發展很快,從乙個遊客的認知感覺應該是這幾個區里較快的,而且每乙個在天津都是亮點,用當下的話來說,都是網紅熱點,在網上各大平台也都有推薦,而且只要提前購票都會有優惠,有時各個 平台都做些 啊補貼呀,實惠多些要提早預定能遇到,當天不一定有,這樣很好,十分適合提前計畫出行,能得到 上的獎勵優待...