首页 > 其他分享 >P1186 玛丽卡

P1186 玛丽卡

时间:2025-01-22 19:58:52浏览次数:1  
标签:删除 int 短路 枚举 玛丽 dijkstra P1186 dis

P1186 玛丽卡

本题与该题差不多,是那道题的加强版。

题目翻译:

给定一个无向连通图,共有 \(n\) 个节点,和 \(m\) 条边。求若可以使任意删除一条边,那怎样删除才能使其最短路长度的增值最多,即让一条路边权删除使得删除后的最短路长度与删除前最短路长度的差最大,并输出这个差。

思路:

本题由于是求最短路,且无负边权,考虑用 \(dijkstra\) 但题目中,节点数 \(n\) 较少,而边数 \(m\) 较多,为稠密图,所以这里用复杂度为 \(O(n^2)\) 的普通 \(dijkstra\) 反而比复杂度为 \(O((n+m)log n)\) 的堆优化后的 \(dijkstra\) 好。我们只需要暴力枚举每个边,使其翻倍,求出最大值即可。但这样暴力枚举复杂度较高,无法 \(AC\) 该题。

考虑优化:

我们发现,删除的边一定是在,原先的最短路上面,否则你删除其他边,对该最短路没有任何影响,本来就不走。所以我们只需要,在跑 \(dijkstra\) 时储存下来路径,然后枚举删边时,只需要枚举路径上的边即可。

但是 你这样也只能得 \(97pts\) ,还是会有一个点 \(T\) 了,所以你只需要在枚举的循环中加入if(1.0*clock()/CLOCKS_PER_SEC>0.97)break; 即运行时间超过 \(0.97\) 秒就自动退出,这样就很有可能已经找到了答案(这道题就是),若不行就在加个随机。看脸过。

完整代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
const int inf=0x3f3f3f3f;
struct edge{
    int v,w;
};
vector<edge>e[N];
int vis[N],dis[N],from[N];
pair<int,int>id[N];
int n;
int len;
void dijkstra(bool flag){
    memset(vis,0,sizeof(vis));
    memset(dis,0x3f,sizeof(dis));
    dis[1]=0;
    for(int i=1;i<=n;i++){
        int u=0,mi=inf;
        for(int j=1;j<=n;j++){
            if(!vis[j] && dis[j]<mi){
                u=j;
                mi=dis[j];
            }
        }
        vis[u]=1;
        for(std::vector<edge>::size_type j=0;j<e[u].size();j++){
            int v=e[u][j].v,w=e[u][j].w;
            if(dis[v]>dis[u]+w){
                dis[v]=dis[u]+w;
                if(flag){
                    from[v]=u;
                    id[v]={u,j};
                }
            }
        }
    }
}
int main(){
    int m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++){
        int u,v,w;
        scanf("%d%d%d",&u,&v,&w);
        e[u].push_back({v,w});
        e[v].push_back({u,w});
    }
    dijkstra(1);
    int ans=0;
    int now=n;
    while(from[now]){     
        int w=e[id[now].first][id[now].second].w;
        e[id[now].first][id[now].second].w=inf;
        dijkstra(0);
        ans=max(ans,dis[n]);
        e[id[now].first][id[now].second].w=w;
        now=from[now];
        if(1.0*clock()/CLOCKS_PER_SEC>0.97)break;
    }
    printf("%d",ans);
}

\(dijkstra\) 讲解

标签:删除,int,短路,枚举,玛丽,dijkstra,P1186,dis
From: https://www.cnblogs.com/XichenOC/p/18686700

相关文章

  • P1000 超级玛丽游戏
    #include<stdio.h>intmain(){printf("********\n""************\n""####....#.\n""#..###.....##....\n""......
  • 【Python游戏开发】用Python实现一个简易的超级玛丽游戏!
    前言小时候最喜欢玩的小游戏就是超级玛丽了,有刺激有又技巧,通关真的很难,救下小公主还被抓走了,唉,心累,最后还是硬着头皮继续闯,终于要通关了,之后再玩还是没有那么容易,哈哈,不知道现在能不能通关,今天就来实现一下,制作一个简易版的超级玛丽游戏如果你正在学习Python并且缺少项目......
  • P1000 超级玛丽游戏
    #include<iostream>usingnamespacestd;intmain(){ cout<<"********\n"; cout<<"************\n"; cout<<"####....#.\n"; cout<<"......
  • 宠物勺子秤芯片解决方案CSU8RP1186
    宠物勺子秤,一种1kg量程的便携式计量勺,主要是用来计算喂食的宠物食物重量,控制宠物饮食来保证宠物体重。这款宠物勺电子秤,采用CSU8RP1186主控开发完成,这款高性能单片机,,集成了24Bit高精度ADC,工作电压(2.4~3.6V),自带4×12的LCD驱动可满足大部分LCD显示需求,若是需要做LED显示芯片可......
  • 用JavaScript做超级玛丽小游戏
    一、前言前几天用JS实现扫雷和贪吃蛇(通过HTML的DOM节点实现基本界面,界面背景简单,交互简单)。比较复杂的是植物大战僵尸,不同的关卡设置单独的函数。所以还比较难。超级玛丽通过canvas实现背景,交互很复杂,功能很多,JS代码完全是有汇编语言反编译成C语言,然后把C语言转换成JS实现的......
  • 【Python实战项目】用Python制作游戏—pygame超级玛丽!游戏开发
    1、需求分析具备功能播放与停止背景音乐随机生成管道与导弹障碍显示积分跳跃躲避障碍碰撞障碍2、游戏功能结构玛丽冒险的功能结构主要分为三类,分别为音效、主窗体以及随机出现的障碍物。如下图3、游戏业务流程根据该游戏的需求分析以及功能结构##-、游戏预览......
  • 用python代码实现超级玛丽游戏(详细动画展示+源码分享)
    效果展示:温馨提示:篇幅有限,完整代码已打包文件夹,获取方式在:1.画面和角色的导入创建屏幕、从图片中导入Mario#屏幕创建和初始化参数self.screen=pygame.display.set_mode((WIDTH,HEIGHT))self.rect=self.screen.get_rect()pygame.display.set_caption(TITLE)......
  • 5分钟在阿里云上部署了超级玛丽小游戏,是一种什么样的体验?
    大家好,我是java1234_小锋老师,作为程序设计开发人员,云部署项目是最基本的技能。所以锋哥分享下如何在阿里云上部署项目,我们以部署超级玛丽网页小游戏为例,教大家熟悉Linux云服务器,熟悉宝塔应用,学习最基本的项目部署。大家后续也可以搭建的自己的博客和应用。阿里云主机购买......
  • 洛谷P1000超级玛丽游戏C++
    题目描述超级玛丽是一个非常经典的游戏。请你用字符画的形式输出超级玛丽中的一个场景。********************####....#.#..###.....##....###.......############......
  • 家用电子秤芯片CSU8RP1186可开发方案
     随着科技的不断发展,时代的变化,电子秤已经成为我们日常生活中不可或缺的测量工具。电子秤由称重模块、ADC芯片、MCU主控芯片、按键模块及显示模块等设计开发组成。当物体放到秤体上时,称重模块中的压力传感器取得称重物体的信息,再由ADC芯片将模拟信号转化为数字信号。MCU主控芯片......