旅遊 狀壓 最短路

2021-08-22 15:20:13 字數 1532 閱讀 7814

description

db愛好運動,但是單純的運動會使得他很枯燥,現在他想邊跑步邊看風景。已知現在有n個風景點(編號為1號~n號),同時有m條道路將這n個風景點連線起來。

這些風景點總共有3類:a,b,c;為了方便表示,我們令 a=0,b=1,c=2。db一開始在1號風景點(可以為a,b,c類)。現在db想在跑步的過程中經過至少乙個b類風景點的同時至少經過乙個c類風景點,最後再回到1號風景點。現在db想要在盡可能短的時間內跑步結束(因為他要去找小姐姐了),你能幫他找出一條路程最短同時滿足題目條件的路徑嗎?

input

第一行兩個整數,n和m。n代表風景點個數,m代表風景點之間邊數(保證無重邊,所有點是聯通的)

第二行n個整數,代表是哪一類風景點(0,1,2)三種。

接下來m行,每行三個整數(u,v,w)代表u和v風景點間距離為w。

(2<=n<=200,000),(2<=m<=200,000),(1<=w<=1,000,000)

output

輸出一行db跑過的最短路程

思路:最短路+狀壓,處理一下就行了

#include #define eps 1e-8

#define inf 0x3f3f3f3f

#define mod 1e9+7

#define pi acos(-1)

#define lson l,mid,rt<<1

#define rson mid+1,r,rt<<1|1

#define clr(x,y) memset((x),y,sizeof(x))

using namespace std;

typedef long long ll;

typedef unsigned long long ull;

const int seed = 131;

const int maxn = 2e5 + 5;

int n, m;

int a[maxn];

struct node

node(int v, int w, int state): v(v), w(w), state(state) {}

bool operator < (const node &a)const

} e[3 * maxn];

int tot, head[maxn];

void add_edge(int u, int v, int w)

int vis[maxn][10];//vis[i][j]表示當前位於i節點,且狀態是j是是否被訪問

int dis[maxn][10];//距離

void dij(int num) }}

}int main()

dij(1);

ll ans = min(dis[1][6], dis[1][7]);

//a是0,b是1,c是2,所以根據題意我們可以知道最後合法狀態是6(110),7(111)

printf("%lld\n", ans);

return 0;

}

POJ 3230 Travel(最短路 狀壓DP)

一張 n n 個節點 m role presentation style position relative m m條邊的圖,每個節點代表乙個城市,每條邊代表連線兩個城市,花費一定的路徑 雙向 你選擇了 h h 個城市,現在要這些城市中打工。在第 i role presentation style ...

香蕉oi 燃燒的火焰(最短路 狀壓)

我不會的都是好題。一張連通的圖,有k k 20 k k le 20 k k 20 個點被點燃了。每條邊有乙個權值表示從乙個點燒到另乙個點需要的時間。現在可以選擇一些點滅火,求有多少種滅火方案不會使燒完所有點的用總時間變長。正難則反,求可以使總時間邊長的滅火方案。k kk遍最短路,求出每個點u uu被...

HDU 4568 Hunter 最短路 狀壓DP

題意 給乙個n m的格仔,格仔中有一些數,如果是正整數則為到此格仔的花費,如果為 1表示此格仔不可到,現在給k個寶藏的地點 k 13 求乙個人從邊界外一點進入整個棋盤,然後拿走所有能拿走的寶藏的最小花費,如果一次不能拿走所有能拿到的或者根本拿不到任何寶藏,輸出0.解法 看到k的範圍應該想到狀態壓縮,...