zoukankan      html  css  js  c++  java
  • LUOGU P1186 玛丽卡

    传送门

    解题思路

    题目描述感人。。解释一下就是这个人跟系统博弈,系统切一条边,然后使得这个人走最短路最长。做法比较自然,先跑个最短路记录路径,然后枚举路径跑最短路,求最大值。因为最短路不可能出现环,所以这样的复杂度是$O(n^2log(m)$。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<queue>
    
    using namespace std;
    const int MAXN = 1005;
    const int MAXM = 1000005;
    
    inline int rd(){
        int x=0,f=1;char ch=getchar();
        while(!isdigit(ch)) {f=ch=='-'?0:1;ch=getchar();}
        while(isdigit(ch))  {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
        return f?x:-x;
    }
    
    int n,m,head[MAXN],cnt=1,fa[MAXN],dis[MAXN],ans;
    bool cut[MAXM],vis[MAXN];
    int to[MAXM<<1],nxt[MAXM<<1],val[MAXM<<1];
    
    struct Node{
        int w,id;
        friend bool operator<(const Node A,const Node B){
            return A.w>B.w;
        }
    };
    
    priority_queue<Node> Q;
    
    inline void add(int bg,int ed,int w){
        to[++cnt]=ed,nxt[cnt]=head[bg],val[cnt]=w,head[bg]=cnt;
    }
    
    void dijkstra(bool flag){
        memset(dis,0x3f,sizeof(dis));
        memset(vis,false,sizeof(vis));
        Node now;now.id=1;now.w=0;dis[1]=0;Q.push(now);
        while(!Q.empty()){
            Node zz=Q.top();Q.pop();int x=zz.id;
            if(dis[x]!=zz.w || vis[x]) continue;vis[x]=1;
            for(register int i=head[x];i;i=nxt[i]){
                if(cut[i]) continue;int u=to[i];
                if(dis[u]<=dis[x]+val[i]) continue;
                if(flag) fa[u]=x;
                dis[u]=dis[x]+val[i];
                now.id=u;now.w=dis[u];Q.push(now);
            }
        }    
        if(flag) return;
        ans=max(ans,dis[n]);
    }
    
    int main(){
        n=rd(),m=rd();int x,y,z;
        for(register int i=1;i<=m;i++){
            x=rd(),y=rd(),z=rd();
            add(x,y,z),add(y,x,z);
        }
        dijkstra(1);    
        int now=n,k;
        while(fa[now]){
            for(register int i=head[now];i;i=nxt[i])
                if(to[i]==fa[now]) {cut[i]=cut[i^1]=1;k=i;break;}
            dijkstra(0);
            now=fa[now];cut[k]=cut[k^1]=0;
        }
        printf("%d",ans);
        return 0;
    }
    View Code
  • 相关阅读:
    linux安装jdk
    maven工程直接部署在tomcat上
    将maven工程转成dynamic web project
    史上最全最强SpringMVC详细示例实战教程
    06-spring框架—— Spring 与Web
    05-spring框架—— Spring 事务
    04-spring框架—— Spring 集成 MyBatis
    03-spring框架—— AOP 面向切面编程
    01-spring框架——spring概述
    我对于语言只是工具的理解和感悟
  • 原文地址:https://www.cnblogs.com/sdfzsyq/p/9751767.html
Copyright © 2011-2022 走看看