zoukankan      html  css  js  c++  java
  • 桐人的约会

    题目描述

    这是一个风和日丽的日子,桐人和诗乃在约会。他们所在的城市共有N个街区,和M条道路,每条道路连接两个不同的街区,并且通过一条道路需要花费一些时间。他们现在处于N号街区,正在享受幸福时光的桐人完全忘记了他的手机被亚丝娜安装了监控装置的事情,此时亚丝娜已经得知了桐人的位置以及他正在和一个妹子约会的事实,十分愤怒,于是从她所在的1号街区火速赶往N号街区。现在这个城市中有一条道路正在维修,不能通行,不过不论是哪条道路处于维修中,均存在一条路径可以从1号街区前往N号街区,而且亚丝娜一定会选取最短路前往N号街区。现在你很好奇,桐人的美好时光最多还能持续多久,即亚丝娜最多要花费多长的时间才能到达N号街区。

    输入
    第1行:两个正整数N,M,N表示街区个数,M表示道路数。
    第2到M+1行 每行三个整数 u,v,w 表示存在一条连接u和v的道路,通过这条道路花费的时间为w
    数据保证没有重边和自环

    输出
    一个整数,表示最多花费的时间。

    输入样例
    5 7
    1 2 8
    1 4 10
    2 3 9
    2 4 10
    2 5 1
    3 4 7
    3 5 10

    输出样例
    27

    说明
    【数据规模】
    30% N<=5, M<=10
    60% N<=1000,M<=10000,w=1
    100% N<=1000, M<=N*(N-1)/2,1<=w<=1000
    .
    .
    .
    .
    .
    分析
    如果存在一条路径会影响1至n的最短路,那么这段路径一定存在于最短路上 ,所以找一条最短路,并枚举去掉的路径,找最短路中的最长路。
    .
    .
    .
    .
    .
    程序:

    #include <stdio.h>
    #include <string.h>
    #include <queue>
    #define maxn 1000
    using namespace std;
    
    int ls[2000001],zd[1001],cnt=0;
    
    struct edge
    {
    	int to,w,next,wz,bz;
    }e[2000001];
    
    void add(int x,int y,int w)
    {
        e[++cnt].to=y;e[cnt].w=w;e[cnt].next=ls[x];e[cnt].wz=cnt+1;e[cnt].bz=0;
        ls[x]=cnt;
        e[++cnt].to=x;e[cnt].w=w;e[cnt].next=ls[y];e[cnt].wz=cnt-1;e[cnt].bz=0;
        ls[y]=cnt;
    }
    
    int spfa(int s,int t,int flag)
    {
    	int d[1001];
    	bool v[1001];
    	memset(d,0x3f,sizeof(d));
    	memset(v,false,sizeof(v));
        queue<int>q;
        q.push(s);
        d[s]=0;
        v[s]=true;
        while (!q.empty())
        {
            int tp=q.front();
    		q.pop();
            for (int i=ls[tp];i;i=e[i].next)
                if (e[i].w+d[tp]<d[e[i].to]&&!e[i].bz)
                {
                	d[e[i].to]=d[tp]+e[i].w;
                    if (flag==0) zd[e[i].to]=tp;
                    if (!v[e[i].to])
                    {
                        v[e[i].to]=true;
                        q.push(e[i].to);
                    }
                }
            v[tp]=false;
        }
        return d[t];
    }
    int main()
    {
        int n,m;
        scanf("%d%d",&n,&m);
        for (int i=1;i<=m;i++)
        {
            int u,v,w;
            scanf("%d%d%d",&u,&v,&w);
            add(u,v,w);
        }
        spfa(1,n,0);
        int ans=0;
        for (int i=n;i;i=zd[i])
        {
            for (int j=ls[i];j;j=e[j].next)
                if (e[j].to==zd[i])
                {
                    e[j].bz=e[e[j].wz].bz=1;
                    int s=spfa(1,n,1);
                    if (s>ans) ans=s;
                    e[j].bz=e[e[j].wz].bz=0;
                }
        }
        printf("%d",ans);
        return 0;
    }
    
  • 相关阅读:
    vs2015 系统找不到指定的文件(异常来自HRESULT:0x80070002)问题的解决方法
    Quartz定时任务和IIS程序池闲置超时时间冲突解决方案
    怎样设置IIS6.0的闲置超时时间
    C#窗体如何通过keybd_event()函数模拟键盘按键(组合键)产生事件
    安装完DevExpress14.2.5,如何破解它呢?
    IIS6.0发布后对路径“D:xxxxxxxweb.config”的访问被拒绝问题的解决方法
    CentOS7 nginx+tomcat实现代理访问java web项目让项目支持jsp和php
    col-xs , col-sm , col-md , col-lg是什么意思?什么时候用?
    Linux 防火墙命令的操作命令CentOS
    Linux(centos)新建,删除,移动,重命名文件夹和文件的命令
  • 原文地址:https://www.cnblogs.com/YYC-0304/p/10292840.html
Copyright © 2011-2022 走看看