鏈結4是多組資料,請自行改動。
題意請看題目鏈結~
大致思路:既然要破壞乙個點必須破壞保護這個點的節點,那麼我記錄一下乙個點保護哪幾個點,保護他的點有幾個,這樣dist就不光是最短路了,就是能保護這個點的所有點被破壞,在這個前提下的最短時間,通過dijkstra的鬆弛操作進行改動可以實現這個操作。
核心**:
鬆弛操作時:
heapnode f = q.top();
q.pop();
if(vis[f.u]) continue;
vis[f.u] = 1;
//ff的意思是保護當前點的所有點被破壞,在這種情況下的最短時間
//son是當前節點保護的所有的點,是乙個vector,下面有具體**
//ff表示的是保護她的點全部被破壞的最早時間
for(int i = 0;i < sn[f.u].size();i ++)
for(int i = head[f.u];i;i = next_[i])
}//檢查所有的點,在開始時dist是inf,然後通過dijkstra的鬆弛操作會改變dist值,於是和ff取max,時刻想著ff的含義
//for(int i = 1;i <= n;i ++));}
}
完整**:
#include
#include
#include
#include
#include
using
namespace
std;
const
int size = 3010;
const
int size2 = 70010;
struct heapnode
}edges[size2];
int head[size],next_[size2],tot,dist[size],ff[size],fa[size];
bool vis[size];
vector
sn[size];
void init()
int n,m;
void rd(int &x)
void build(int f,int t,int d)
priority_queue q;
void dijkstra()
); dist[1] = 0;
while(!q.empty())
for(int i = head[f.u];i;i = next_[i])}//
for(int i = 1;i <= n;i ++));}
}}
}int main()
for(int i = 1;i <= n;i ++)
}dijkstra();
printf("%d\n",dist[n]);
return
0;}
線段樹為什麼要開四倍空間
最近在看 具體數學 這篇當做是乙個練習吧。假設我們用乙個陣列來頭輕腳重地儲存乙個線段樹,根節點是1,孩子節點分別是2n,2n 1,那麼,設線段長為l 即 1.l 1 設樹的高度為h,對h,有 h l 1,1 h l 2 l 1 l 1 這是乙個很簡單的遞迴式,並用公式3.11逐次代換,就等到h l ...
Milk誕生,據說比其他程式語言快四倍!
文章講的是milk誕生,據說比其他程式語言快四倍,近日,milk語言誕生於麻省理工學院,主要針對大型分散資料集資料 記憶體管理的問題。現在,記憶體管理足以成為傳統資料集的挑戰,當大資料時代到來,這一程序似乎又變得緩慢了。麻省理工學院本週宣布了一種新的程式語言,以期解決該問題,並宣布該語言相比於其他程...
線段樹 4n 開四倍空間的原因
一 為何要使用線段樹?對於某一類問題,我們主要關注的是乙個線段或者區間。對於給定區間,更新區間中乙個元素或者乙個區間的值,查詢乙個區間 i,j 的最大值 最小值,或者區間數字和。線段樹不一定滿二叉樹,也不一定是完全二叉樹,但一定是平衡二叉樹,下面是線段樹元素個數n 2 k的情況,是滿二叉樹。下面是線...