ICPC North Central NA Contest 2018 G . Tima goes to Xentopia(最短路 空间优化 剪枝)

简介: ICPC North Central NA Contest 2018 G . Tima goes to Xentopia(最短路 空间优化 剪枝)

linkkkk

题意:

n点m mm边的图,每条边有边权和颜色,颜色有红蓝白三种,问从s ss到t tt恰好走k 1 k1k1条红边和k 2 k2k2条蓝边的最短距离。

思路:

dp[i][j][k]表示从s出发到达点i并且经过了j条红边,k条蓝边的最短距离。

转移就是普通的dijkstra转移,但是这样内存超限。

题目中有一个条件是k 1 ∗ k 2 < = 800如果我们始终把k值大的看做是红边,小的看做是蓝边,这样只需要开455 ∗ 801 ∗ 101的d p数组。

有一个剪枝就是,如果当前经过的红边> k 1或是蓝边> k 2,都一定不符合题意了,直接跳过即可,

参考博客

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;typedef unsigned long long ull;
typedef pair<ll,ll>PLL;typedef pair<int,int>PII;typedef pair<double,double>PDD;
#define I_int ll
inline ll read(){ll x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;}
#define read read()
#define rep(i, a, b) for(int i=(a);i<=(b);++i)
#define dep(i, a, b) for(int i=(a);i>=(b);--i)
ll ksm(ll a,ll b,ll p){ll res=1;while(b){if(b&1)res=res*a%p;a=a*a%p;b>>=1;}return res;}
const int maxn=4e5+7,maxm=1e6+7,mod=1e9+7;
int n,m,k1,k2,flag=0,s,t;
struct node{
    int e,ne,w,c;
}edge[1100*2];
int h[1100],idx;
ll dp[451][801][101];
struct node1{
    ll d,id,t1,t2;
    bool operator<(const node1 &a)const{
        return d>a.d;
    }
};
priority_queue<node1>q;
void add(ll u,ll v,ll w,ll c){
    edge[idx]={v,h[u],w,c};h[u]=idx++;
}
void bfs(){
    memset(dp,-1,sizeof dp);
    dp[s][0][0]=0;
    q.push({0,s,0,0});
    while(!q.empty()){
        node1 t=q.top();q.pop();
        ll d=t.d,id=t.id,t1=t.t1,t2=t.t2;
        if(t1>k1||t2>k2) continue;
        for(int i=h[id];~i;i=edge[i].ne){
            int j=edge[i].e,w=edge[i].w,c=edge[i].c;
            int now1=0,now2=0;
            if(c==1) now1=1;
            if(c==2) now2=1;
            if(dp[j][t1+now1][t2+now2]==-1||dp[j][t1+now1][t2+now2]>dp[id][t1][t2]+w){
                dp[j][t1+now1][t2+now2]=dp[id][t1][t2]+w;
                q.push({dp[j][t1+now1][t2+now2],j,t1+now1,t2+now2});
            }
        }
    }
}
int main() {
    memset(h,-1,sizeof h);
    n=read,m=read,k1=read,k2=read;
    if(k1<k2) swap(k1,k2),flag=1;
    for(int i=1;i<=m;i++){
        ll u=read,v=read,w=read,c=read;
        if(flag){
            if(c==1) c=2;
            else if(c==2) c=1;
        }
        add(u,v,w,c);
        add(v,u,w,c);
    }
    s=read,t=read;
    bfs();
    printf("%lld\n",dp[t][k1][k2]);
    return 0;
}


目录
相关文章
UVa668 - Parliament(贪心)
UVa668 - Parliament(贪心)
61 0
|
机器学习/深度学习 Windows
The 2022 ICPC Asia Regionals Online Contest (I)-D题题解(DFS暴搜+剪枝+打表去重+二分)
时间复杂度:O(227 + nlog(n) + T * log(n)),227是DFS打表的时间,nlog(n)是vertor排序的时间,T*log(n)是询问次数和二分搜答案的时间。(如果算错了,评论或者私信指出谢谢)
174 0
The 2022 ICPC Asia Regionals Online Contest (I)-D题题解(DFS暴搜+剪枝+打表去重+二分)
upc2021秋组队训练赛第一场 ICPC North Central NA Contest 2020
upc2021秋组队训练赛第一场 ICPC North Central NA Contest 2020
95 0
upc2021秋组队训练赛第一场 ICPC North Central NA Contest 2020
ICPC North Central NA Contest 2018 C . Rational Ratio(结论 模拟 gcd)
ICPC North Central NA Contest 2018 C . Rational Ratio(结论 模拟 gcd)
115 0
2020 ICPC Asia Taipei-Hsinchu Site Programming Contest H. Optimization for UltraNet (二分+最小生成树+算贡献)
2020 ICPC Asia Taipei-Hsinchu Site Programming Contest H. Optimization for UltraNet (二分+最小生成树+算贡献)
129 0
[North Central NA Contest 2018] Rational Ratio | 规律 细节模拟
Description Every (positive) rational number can be expressed as a ratio of two (positive) integers. However, in decimal form, rational numbers often have an infifinitely repeating pattern, e.g., 1/7 = 0.142857142857142857…
111 0
[North Central NA Contest 2018] Rational Ratio | 规律 细节模拟
[UVA1364 | POJ | NC]Knights of the Round Table | Tarjan 求点双 | 二分图 | 综合图论
我们可以很轻松地发现,被提出的都是在点双连通分量之外的,比如该图中的1 和 5 ,那么怎么判断哪些点不在环中呢? 此时我们还可以逆向思考,不 在 环 中 的 = = 总 的 − 在 环 中 的,所以说现在问题就转换成了满足条件的环内的点的个数
133 0
[UVA1364 | POJ | NC]Knights of the Round Table | Tarjan 求点双 | 二分图 | 综合图论
|
机器学习/深度学习
2019ICPC上海Spanning Tree Removal构造题
本题是一个spj的问题 题意是给定一个完全图,包含了n个节点,每次可以在这个图中选择一个生成树,然后将该生成树的所有边都删除,然后得到一个新图,然后再从新的图中重复上述操作,问最多可以操作多少次,对于每一次操作,输出选择的生成树中的所有边(n-1行) 在lc哥的图中稍加改造,做成这个样子: 图中有6个点,将点按照0 -> 5编号
111 0
2019ICPC上海Spanning Tree Removal构造题
[ICPC 46th Shanghai] Life is a Game 克鲁斯卡尔重构树
题目大意: 给定n个点,m条边,有q个询问 每个点有一个(能量值)点权,每条边有一个边权 m条边描述为u v w表示有一条u与v相连的边权为w的通路 在每一次询问中,给定一个点x和现有的能量值k,每次只能是在当前能量值大于边权的时候到达另一个点,并获取这个点的能量值(路可以重复走),问最终能够获得多大的能量值
138 0
|
人工智能 BI
[UVA 1599] Ideal Path | 细节最短路
Description New labyrinth attraction is open in New Lostland amusement park. The labyrinth consists of n rooms connected by m passages. Each passage is colored into some color ci .
208 0