首页 > 其他分享 >hey_left 3 Codeforces Round 918 (Div. 4) 再续

hey_left 3 Codeforces Round 918 (Div. 4) 再续

时间:2024-01-15 22:49:14浏览次数:34  
标签:dist int ll Codeforces hey 918 push ns dis

题目链接

F.

找了些题解,但都看的不是很懂
先去又梳理了一遍堆优化版的dij

每次用当前可到达的最小的边去进行松弛操作
标记数组,若该点已经加入确定点集,就跳过
别忘了dist[]数组初始化为无穷大,这样才会全部都被更新

#define ll long long
const int inf=0x3f3f3f3f;
const int N=1e5+10;
int n,m,s;//s是起点 
vector<pair<int,int>> g[N];
int dist[N];
bool st[N];//是否加入确定的点集 
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> q;
void dij(){
    memset(dist,inf,sizeof(dist));//初始化 
    dist[s]=0;
    q.push({0,s});
    while(q.size()){
        auto k=q.top();q.pop();
        int ver=k.second,distance=k.first;
        if(st[ver])continue;
        st[ver]=true;
        for(int i=0;i<g[ver].size();i++){
            int j=g[ver][i].first;
            if(dist[j]>distance+g[ver][i].second){
                dist[j]=distance+g[ver][i].second;
                q.push({dist[j],j});
            }
        }
    }
}

然后果真思路清晰了起来+一些题解的支点
但挣扎一番后,困在了定性思维
dist[][]的二维数组,第一维是点,第二维是速率
因为数据都不大,这样做没问题
我默认速率是这个点要确定的速率,因此没法儿做,要么枚举不了那么多状态,要么没办法确定
于是去死磕题解
发现它的二维是这个点由什么速率转换而来的,这是唯一确定的
push进队列里的才讨论用自己的速率还是延续上一轮的速率

其实相比普通的dij
就是多了一维速率,其他是一样的

#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
typedef long long ll;
struct Edge {
    ll to, w;
};
struct Node {
    ll pos, w, s;
     bool operator<(const Node &x) const {
        return w > x.w;
    }
} last;
vector<Edge> G[N];

priority_queue<Node> heap;
ll t, n, m, u, v, w, s[N], dis[N][N], vis[N][N];
inline ll Dijkstra() {
    heap.push({1, 0, s[1]});
    while (!heap.empty()) {
        last = heap.top(), heap.pop();

        for (auto edge : G[last.pos]) {
            const ll ns = last.s, u = edge.to;
            if (dis[u][ns] > last.w + edge.w * ns) {
                dis[u][ns] = last.w + edge.w * ns;
                heap.push({u, dis[u][ns], ns});
                heap.push({u, dis[u][ns], s[u]});
            }
        }
    }
    ll minn = LLONG_MAX;
    for (int i = 1; i <= 1000; i++) {
        minn = min(minn, dis[n][i]);
    }
    return minn;
}
 void solve() {
    cin >> n >> m;
    memset(dis, 0x3f, sizeof(dis));
    memset(vis, 0x00, sizeof(vis));
    for (int i = 1; i <= n; i++) G[i].clear();
    for (int i = 1; i <= m; i++) {
        cin >> u >> v >> w;
        G[u].push_back({v, w});
        G[v].push_back({u, w});
    }
    for (int i = 1; i <= n; i++) {
        cin >> s[i];
    }
    cout << Dijkstra() << '\n';
}
int main() {
    cin >> t;
    while (t--) solve();
    return 0;
}

标签:dist,int,ll,Codeforces,hey,918,push,ns,dis
From: https://www.cnblogs.com/wwww-/p/17966554

相关文章

  • CodeForces 1500C Matrix Sorting
    洛谷传送门CF传送门做了好久。怎么会是呢。题目的操作可以看成,求出一些关键字,使得\(B\)矩阵的行是由\(A\)按照这些第\(1\)关键字、第\(2\)关键字一直到第\(k\)关键字,最后还有一个原来所在行下标的关键字,从小到大排序。肯定是从排好序的\(B\)矩阵入手。首先任意找......
  • CodeForces 1266F Almost Same Distance
    洛谷传送门CF传送门好厉害。特判\(k=1\)。首先经过观察,我们可以按照\(k\)的奇偶性讨论:\(k\)为偶数,有一个中心点挂了若干条长度为\(\frac{k}{2}\)的链。\(k\)为偶数,有两个中心点,两边挂了若干条长度为\(\frac{k}{2}\)的链;\(k\)为奇数,有一个中心点挂了若干条长度......
  • hey_left 2 Codeforces Round 918 (Div. 4) 续
    题目链接F.常规的树状数组求逆序对需要注意的是,因为是下标与值的映射,所以数值不能为负数,也不能太大然后传参数的时候,参数是最大数值切记切记#include<bits/stdc++.h>usingnamespacestd;constintN=2e5+10;template<typenameT>structTreeArray{vector<T>t......
  • Codeforces Round 919 (Div. 2)(A~D) 题解
    CodeforcesRound919(Div.2)(A~D)题解A.SatisfyingConstraints题意:给你一些条件让你求出满足条件的整数有多少个。模拟即可。#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constllMAXN=2e5+5;llTex=1,n;voidAC(){ cin>>n; lll=......
  • Codeforces Round 919 (Div. 2)
    CodeforcesRound919(Div.2)A-SatisfyingConstraints#include<bits/stdc++.h>#defineendl'\n'#defineintlonglongusingnamespacestd;constintN=1e6+10;voidsolve(){ intn; intl=-1; intr=1e9+10; cin>>......
  • CodeForces 1920F2 Smooth Sailing (Hard Version)
    洛谷传送门CF传送门首先需要知道的一个trick:判断一个点是否在一个闭合回路内部,从这个点向任意方向引一条射线,若不考虑相切,那么和回路的交点为奇数时这个点在回路内部,否则在外部。那么这题要判断一个回路是否包含全部的island,可以找到任意一个island向右引一条射线。给每......
  • Hey left 1 Codeforces Round 918 (Div. 4)
    题目链接A.3个数,其中2个数相同,输出不相同的那个可以用ifelse判断,较为麻烦用的map,输出出现一次的#include<bits/stdc++.h>usingnamespacestd;constintN=1e5+10;voidsolve(){map<int,int>mp;for(inti=0,x;i<3;i++){cin>>x;mp[x]++;......
  • CodeForces 1237H Balanced Reversals
    洛谷传送门CF传送门容易想到把\(s,t\)分成长度为\(2\)的段考虑。容易发现\(00,11\)的个数在操作过程中不会改变,所以若两串的\(00\)或\(11\)个数不相等则无解。考虑依次对\(i=2,4,\ldots,n\)构造\(s[1:i]=t[n-i+1:n]\)。对于\(s_{j-1}s_j=y......
  • Codeforces [Hello 2024]
    CodeforcesHello2024主打一个昏了头A.WalletExchange#include<bits/stdc++.h>#defineendl'\n'//#defineintlonglongusingnamespacestd;constintN=2e5+10;inta,b;voidsolve(){ cin>>a>>b; if((a+b)&1)cout<<......
  • CodeForces 1379E Inverse Genealogy
    洛谷传送门CF传送门\(n\)为偶数显然无解。否则我们可以构造一棵\(n\)个点的完全二叉树,当\(n+1\)是\(2\)的幂时满足\(m=1\),否则\(m=0\)。当\(n\ge5\)时可以递归至\((n-2,m-1)\),再挂一个叶子即可。但是可能会出现\(n+1\)不是\(2\)的幂,但\(n-......