無向圖,給定s和t,多次詢問在刪除某條邊時兩點間最短路
我的spfa被卡了=.=。我們對所有不在最短路徑的上的邊 ,設它的起點為u 終點為v。那麼對於這條邊,包含該邊的最優的s到t路徑就應該是 s-s1-u-v-t1-t 其中s1,t1表示最短路徑上的兩個點。那麼這樣的一條最短路可以再s1-t1中某條邊被刪除時使用,我們用線段樹維護這一過程 qwq 陣列開多了有點暈啊
#include#include#include#include#include#include#includeusing namespace std;
const int maxn=400000+10;
typedef long long ll;
struct treet[maxn<<2];
struct nodetable[maxn<<1];
int tot=1,head[maxn];
void add(int a,int b,int c);head[a]=tot;}
int n,m,s,t,q;
char s[1<<25];
inline long long read()
int pre[maxn],pos[maxn],cnt;
ll f[maxn][2];
bool v[maxn],use[maxn],iskeypoint[maxn];
typedef pairpair;
void spfa()
}}int ans[maxn][2],num[maxn];
void qwq(int k)
}}void maketree(int x,int l,int r)
void change(int x,int l,int r,ll tar)
int mid=t[x].l+t[x].r>>1;
int lc=x<<1,rc=x<<1|1;
if(r<=mid) change(x<<1,l,r,tar);
else if(l>mid) change(x<<1|1,l,r,tar);
else change(x<<1,l,mid,tar),change(x<<1|1,mid+1,r,tar);
}ll res;
void search(int x,int pos)
int main()
s=read(); t=read();
spfa();
int hh=t;
while(hh)
for(int i=1;i<=cnt;i++) num[i]=pos[i];
for(int i=1;i<=cnt;i++) pos[i]=num[cnt-i+1];
memset(num,0,sizeof num);
for(int i=1;i<=cnt;i++) num[pos[i]]=i;
for(int i=1;i<=n;i++) ans[i][0]=-1,ans[i][1]=tot+1;
qwq(0); qwq(1);
maketree(1,1,cnt);
for(int i=1;i<=tot;i++)
if(!use[i])
q=read();
while(q--)
else printf("%lld\n",f[t][0]);
}return 0;
}
BZOJ 2725 Violet 6 故鄉的夢
題意 給出乙個無向圖,給定起點和終點。給出q個詢問,每個詢問是刪除某條邊之後,起點到終點的最短路變成什麼?詢問之間是獨立的。這道題不錯,但是蒟蒻完全不會做qaq,解法參考claris大佬的。首先容易想到如果刪掉的邊不在最短路上的話,最短路是不會變的。於是我們先跑一遍最短路,找出一條最短路。終點是如果...
BZOJ2724 Violet 6 蒲公英 分塊
n 個數,m 次詢問。n leq 40000,m leq 50000 看完題目 呀這不是莫隊裸題嗎?然後經過一波思 forever 考 piano 終於會做了。首先請你自行證明乙個結論 在詢問區間內任取一段子區間,詢問區間內的最小眾數一定是子區間的最小眾數或者出現在詢問區間除掉子區間的其他地方。於是...
BZOJ2709 Violet 1 迷宮花園
這題是許可權題,版權問題不放題意,我來簡要的說一下 給出乙個迷宮,有起始點終點,可以上下左右走,移動的耗時是1,可以改變上下走的耗時為v,給出乙個總耗時l,問在總耗時中的v是多少 顯然這題可以先二分答案v然後跑寬搜或者spfa來判斷,還是蠻簡單的。這題的難點就在於,看到v的範圍很小 0 v 10 就...