K Candies 差分約束 最短路)

2021-09-10 13:26:11 字數 1739 閱讀 4913

有n個孩子,m個關係;關係分別有3個數u,v,w。代表v的糖果數不能多於u    w個,也就是dis[v]<=dis[u]+w;這就轉換成

if(dis[v]>dis[u]+w)            dis[v]=dis[u]+w.

1:spfa+stack

#include#include#include#include#includeconst int maxn=150050;   //15w條邊

const int inf=0x3f3f3f3f;

using namespace std;

struct edge

e[maxn];

const int n=50050; //5w個點

int head[n],vis[n];

int dis[n];

int j,n,m;

void init() //初始化

void add(int u,int v,int w) //前向星優化存圖

void spfa(int s) }}

}int main()

spfa(1);

cout<2:heap_dijkstra

#include#include#include#include#includeusing namespace std;

const int inf=0x3f3f3f3f;

const int maxn=150050; //15w條邊

const int n=30050; //3w個點

int n,m,cnt;

int head[n],dis[n],vis[n];

struct edge

e[maxn];

struct node

bool operator <(const node &r)const

};void init()

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

void heap_dijkstra(int s)

); //s為定點編號,0為最短距離

while(!que.empty()));}

}}

}int main()

heap_dijkstra(1);

cout<3:heap_dijkstra 的pair表示

#include#include#include#include#includeusing namespace std;

typedef pairp; //first最短距離,second定點編號

const int inf=0x3f3f3f3f;

const int maxn=150050; //15w條邊

const int n=30050; //3w個點

int n,m,cnt;

int head[n],dis[n],vis[n];

struct edge

e[maxn];

void init()

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

void heap_dijkstra(int s)

); //0為最短距離,s為定點編號

while(!que.empty()));}

}}

}int main()

heap_dijkstra(1);

cout

}

2018 08 07 最短路徑 差分約束

在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?輸入包括多組資料。每組資料第一行是兩個整數n m n 100,m 10000 n表示成都的大...

差分約束系統 變相的最短路

之前沒有細看,想不明白這個問題怎麼和最短路扯上關係,細細看了看,也沒明白,原因是在看dijk演算法的時候就沒好搞明白它的 實現,以至於這個問題模擬到最短路實現的時候一臉懵,還去瞅了瞅三角不等式是什麼東西,簡單來說,難就難在圖的構造上面,構造好圖之後就是模板,就是之前的內容了,一起看看這個東西吧,on...

差分約束和dp和最短路

我發現學的越深入,各個知識點之間的關係真的就是越緊密,我希望有一天我能學習完所有的演算法,站在演算法的頂端俯瞰各個演算法之間的聯絡,感受演算法之美,感受邏輯之美,想想那時候是多麼的驕傲和自豪啊。很久之前做過的一道題目,當時做的時候是跟著老師的思路來做的,當時並沒有多大的啟發,但是後邊我在看一遍的時候...