From 8508fa6ccee3ab48fdf142d25a60943b4e5d463d Mon Sep 17 00:00:00 2001 From: LogSingleDog <1034028483@qq.com> Date: Thu, 25 Apr 2024 20:28:23 +0800 Subject: [PATCH] graph update --- "5-\345\233\276\350\256\272.md" | 346 +++++++++++++++----------------- 1 file changed, 158 insertions(+), 188 deletions(-) diff --git "a/5-\345\233\276\350\256\272.md" "b/5-\345\233\276\350\256\272.md" index 07a001f..1b5397e 100644 --- "a/5-\345\233\276\350\256\272.md" +++ "b/5-\345\233\276\350\256\272.md" @@ -7,280 +7,250 @@ ```cpp #include using namespace std; -#define int long long -const int inf = 0x3f3f3f3f; -typedef pair PII; -vector mp[100100]; -int n,m,s; -int dis[100100]; -int vis[100100]; -priority_queue,greater > q; +#define ll long long +const ll maxn = 10+1e5; +const ll inf = 0x3f3f3f3f; +typedef pair pll; + vector mp[100100]; + ll n,m,s; + ll dis[100100]; + ll vis[100100]; -void dj(int s) -{ - for(int i=1;i<=n;i++)dis[i]=inf; - dis[s]=0ll; +void dij(ll s){ + for(ll i=1;i<=n;i++){ + dis[i]=inf; + } + dis[s]=0; + priority_queue,greater > q; q.push({dis[s],s}); - - while(!q.empty()) - { - int u=q.top().second; + while(!q.empty()){ + ll u=q.top().second; q.pop(); - if(vis[u])continue; + if(vis[u]) continue; vis[u]=1; - for(auto [w,v]:mp[u]) - { - if(dis[u]+w>n>>m>>s; -for(int i=1;i<=m;i++) -{ - int u,v,w; - cin>>u>>v>>w; - mp[u].push_back({w,v}); -} -dj(s); -for(int i=1;i<=n;i++)cout<>n>>m>>s; + for(ll i=1;i<=m;i++){ + ll u,v,w; + cin>>u>>v>>w; + mp[u].push_back({w,v}); + } + dij(s); + for(ll i=1;i<=n;i++) + cout< -using namespace std; -const int N = 5050; -const int inf=0x3f3f; -int g[N][N],dis[200200]; -bool vis[200200]; -int n,m,ans,u,v,w; -void init(){ - memset(g,inf,sizeof(g)); - memset(dis,inf,sizeof(dis)); -} -void addedge(int u,int v,int w) -{ - if (u != v && g[u][v] > w) g[u][v] = g[v][u] = w; + vector edge[maxn]; + ll dis[maxn]; + ll vis[maxn]; +void update(ll u){ + for(auto [v,w]:edge[u]){ + dis[v]=min(dis[v],w); + } } -void prim(){ - dis[1]=0; - for(int i=1;i<=n;i++){ - int t=0; - for(int j=1;j<=n;j++){ - if(!vis[j]&&dis[j]g[t][j]){ - dis[j]=g[t][j]; +ll prim(ll n){ + for(ll i=1;i<=n;i++){ + vis[i]=0; + dis[i]=inf; + } + vis[1]=1; + update(1); + ll ans=0; + for(ll i=1;i<=n-1;i++){//连接n-1条边 + ll pos,mi=inf; + for(ll j=1;j<=n;j++){ + if(vis[j]) continue; + if(dis[j]>n>>m; -init(); -for(int i=1;i<=m;i++){ - cin>>u>>v>>w; - addedge(u,v,w); - addedge(u,v,w); -} -prim(); -for(int i=1;i<=n;i++){ - if(!vis[i]) { - cout << "orz"; - return 0; +### prim O(mlogm) (小根堆优化) +```cpp + vector edge[maxn]; + ll dis[maxn]; + ll vis[maxn]; +ll prim(ll n){ + for(ll i=1;i<=n;i++){ + vis[i]=0; + dis[i]=inf; } -} -cout<,greater> pq; + pq.push({0,1}); + while(!pq.empty()){ + auto [d,u]=pq.top(); + pq.pop(); + if(vis[u]) continue; + vis[u]=1; + ans+=d; + for(auto [v,w]:edge[u]){ + if(!vis[v]&&w -using namespace std; -#define int long long -int fa[200100]; -struct edge{ - int u,v,w; -}e[200100],mst[200100]; -int n,m,k; -int ans; -bool cmp(edge a,edge b) -{ +typedef struct{ + ll u,v,w; +}eg; + eg e[maxm]; + vector edge[maxn]; + ll fa[maxn]; +bool cmp(eg a,eg b){ return a.w>n>>m; -init(n); -for(int i=1;i<=m;i++)cin>>e[i].u>>e[i].v>>e[i].w; -sort(e+1,e+m+1,cmp); -kruskal(); -if(k==n-1)cout<>u>>v>>w; + edge[u].push_back({v,w}); + edge[v].push_back({u,w}); + e[i].u=u;e[i].v=v;e[i].w=w; } ``` ## LCA ```cpp - #include - +#include using namespace std; -#define IOS ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr); -#define int long long -#define ull unsigned long long +#define IOS ios::sync_with_stdio(false),cin.tie(nullptr), cout.tie(nullptr); +#define ll long long +#define ull unint long long #define lowbit(i) ((i) & (-i)) #define ls(p) (p << 1) #define rs(p) (p << 1 | 1) -#define rep(i, a, b) for (int i = a; i <= b; i++) -#define per(i, a, b) for (int i = a; i >= b; i--) +#define rep(i, a, b) for (ll i = a; i <= b; i++) +#define per(i, a, b) for (ll i = a; i >= b; i--) -typedef pair PII; -const int mod = 1e9 + 7; -const int inf = 0x3f3f3f3f; -const int N = 5e5 + 200; +typedef pair pll; +const ll mod = 1e9 + 7; +const ll inf = 0x3f3f3f3f; +const ll maxn = 5e5 + 200; -int qpow(int a, int n) -{ - int ans = 1; - while (n) - { - if (n & 1) - { - ans = ans * a % mod; - } - a = a * a % mod; - n >>= 1; - } - return ans; -} - -int n, q, root; -vector mp[N]; -int lg2[N]; -int dep[N]; -int f[N][20]; -int vis[N]; -void dfs(int u, int fa = 0) -{ - if (vis[u]) - return; + ll n, q, root; + vector mp[N]; + ll lg2[maxn]; + ll dep[maxn]; + ll f[maxn][20]; + ll vis[maxn]; +void dfs(ll u, ll fa = 0){ + if (vis[u]) return; vis[u] = 1; dep[u] = dep[fa] + 1; f[u][0] = fa; - for (int i = 1; i <= lg2[dep[u]]; i++) - { + for (ll i = 1; i <= lg2[dep[u]]; i++){ f[u][i] = f[f[u][i - 1]][i - 1]; } - for (auto v : mp[u]) - { + for (auto v : mp[u]){ dfs(v, u); } } -int lca(int a, int b) -{ +ll lca(ll a, ll b){ if (dep[a] > dep[b]) swap(a, b); while (dep[a] != dep[b]) b = f[b][lg2[dep[b] - dep[a]]]; if (a == b) return a; - for (int k = lg2[dep[a]]; k >= 0; k--) - { - if (f[a][k] != f[b][k]) - { + for (ll k = lg2[dep[a]]; k >= 0; k--){ + if (f[a][k] != f[b][k]){ a = f[a][k], b = f[b][k]; } } return f[a][0]; } -signed main() -{ - IOS cin >> n >> q >> root; - for (int i = 1; i < n; i++) - { - int u, v; +int main(){ + IOS + cin >> n >> q >> root; + for (ll i = 1; i < n; i++){ + ll u, v; cin >> u >> v; mp[u].push_back(v); mp[v].push_back(u); } - for (int i = 2; i <= n; i++) - { + for (ll i = 2; i <= n; i++){ lg2[i] = lg2[i / 2] + 1; - } + } dfs(root); - while (q--) - { - int u, v; + while (q--){ + ll u, v; cin >> u >> v; cout << lca(u, v) << endl; }