分析:出題人喪心病狂卡spfa......只能用dijkstar+堆優化.
主要的難點是字典序的處理上,乙個想法是在做最短路的時候處理,邊鬆弛邊記錄,比個大小記錄最佳答案.具體的思路大概和最短路計數差不多,當遇到d[u] + w[i] == d[v]是,說明到d[v]有兩條最短路了,更新一下答案。
但是這樣效率太低了,每一次鬆弛都要更新一次,能不能一次性更新完呢?可以的.我們在跑完最短路後把滿足d[u] + w[i] == d[v]的點v加入u的鄰接表中,排個序,然後dfs一遍就好了.
#include #include#include
#include
#include
#include
#include
#include
using
namespace
std;
const
long
long inf =1e15;
struct
node
;bool
operator
int n, m,b[200010],head[200010],to[400010],nextt[400010],tot = 1,w[400010],vis[200010
];int u[400010], v[400010], z[400010],ans[200010
];long
long d[200010
];vector
a[200010
];void add(int x, int y, int
z)void
dijkstar()}}
}bool cmp(int x, int
y)void dfs(int depth, int
x)
for (int i = 0; i < a[x].size(); i++)
dfs(depth + 1
, a[x][i]);
}int
main()
for (int i = 1; i <= n; i++)
d[i] =inf;
dijkstar();
printf(
"%lld\n
", d[n]);
for (int i = 1; i <= m; i++)
if (d[u[i]] + z[i] ==d[v[i]])
a[u[i]].push_back(v[i]);
for (int i = 1; i <= n; i++)
sort(a[i].begin(), a[i].end(), cmp);
memset(vis,
0, sizeof
(vis));
dfs(
1, 1
);
return0;
}
常州模擬賽d8t2 繪畫
分析 考慮記錄每個座標上每個顏色出現了幾次,並由此算出每個顏色 在這個座標上的貢獻。答案肯定是原圖的答案扣去矩形的答案,再加 上那個矩形同種顏色的貢獻,這裡的答案指的是 dis.我們先要記錄每個顏色在各個位置出現的次數,因為每一次都是區間操作嘛,所以我們用二維差分可以很好地維護,字首和求出出現的次數...
常州模擬賽d7t2 陣列
hjz 的陣列初始時有 n 個元素。他可以把乙個位置上的數加上或減去乙個固定的 數 x。一天 ljz 和 hzy 來 hjz 家玩。ljz 突發奇想,提出了乙個問題 如何在給定的 操作步數內最小化陣列所有元素的乘積呢?hjz 百思不得其解,但是他想博得 hzy 的好感,就把這個問題交給你啦 由於最小...
常州模擬賽d2t3 小X的佛光
平日裡最喜歡做的事就是蒸發學水。題目描述 小 x 所在的城市 x 城是乙個含有 n 個節點的無向圖,同時,由於 x 國是一 個發展中國家,為了節約城市建設的經費,x 國首相在建造 x 城時只建造 n 1 條邊,使得城市的各個地點能夠相互到達。小 x 計畫蒸發 q 天的學水,每一天會有一名學水從 a ...