zoukankan      html  css  js  c++  java
  • P1841 [JSOI2007]重要的城市

    题目描述

    参加jsoi冬令营的同学最近发现,由于南航校内修路截断了原来通向计算中心的路,导致去的路程比原先增加了近一公里。而食堂门前施工虽然也截断了原来通向计算中心的路,却没有使路程增加,因为可以找到同样长度的路作替代。其实,问题的关键在于,路截断的地方是交通要点。

    同样的情况也出现在城市间的交通中。某些城市如果出了问题,可能会引起其他很多城市的交通不便。另一些城市则影响不到别的城市的交通。jsoi冬令营的同学发现这是一个有趣的问题,于是决定研究这个问题。

    他们认为这样的城市是重要的:如果一个城市c被破坏后,存在两个不同的城市a和b(a, b均不等于c),a到b的最短距离增长了(或不通),则城市c是重要的。

    jsoi冬令营的同学面对着一张教练组交给他们的城市间交通图,他们希望能找出所有重要的城市。现在就请你来解决这个问题。

    输入输出格式

    输入格式:

    第一行两个整数N,M,N为城市数,M为道路数

    接下来M行,每行三个整数,表示两个城市之间的无向边,以及之间的路的长度

    输出格式:

    一行,按递增次序输出若干的数,表示重要的城市。

    输入输出样例

    输入样例#1: 复制
    4 4
    1 2 1
    2 3 1
    4 1 2
    4 3 2
    输出样例#1: 复制
    2
    

    说明

    30%的数据:Nle 20N20 ;

    60%的数据:Nle 100N100 ;

    100%的数据:Nle 200,Mle frac{N imes (N-1)}{2},0<cle 10000N200,M2N×(N1),0<c10000 。c即路的长度。

    保证不出现重边和自环

    感谢@赵昕鹏 和@qq2477259579 提供程序

    如果没有点的话需要输出一行

    “No important cities.”

    去掉引号

    //挺好的题
    //floyd
    //如果两点之间只有一条最短路的话,那么这条路上所有的点都是重要城市 <--显然
    //如果不止有一条最短路呢?  那么对于这两个点来说,中间的非重合边中间的点不是重要城市 
    //所以,在进行Floyd的时候,如果两个点之间距离被更新,则标记当前最外层的k是重要城市
    //如果有相等长度的路径,则说明两点间有多条最短路,则把两点间重要城市的标记撤销
    //最后输出那些被标记了的点k,他们就是重要城市 
     
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    
    const int N=205;
    const int M=2e4+5;
    
    int n,m;
    int u,v,w;
    int a[N][N];
    int key[N][N];
    bool flag[N];
    
    int read()
    {
        char c=getchar();int num=0;
        for(;!isdigit(c);c=getchar());
        for(;isdigit(c);c=getchar())
            num=num*10+c-'0';
        return num;
    }
    
    int main()
    {
        memset(a,0x3f,sizeof(a));
        n=read(),m=read();
        for(int i=1;i<=m;++i)
        {
            u=read(),v=read(),w=read();
            a[u][v]=a[v][u]=w;
            //add_edge(u,v,w);
            //add_edge(v,u,w);
        }
        for(int k=1;k<=n;++k)
            for(int i=1;i<=n;++i)
            {
                if(i==k)
                    continue;
                for(int j=1;j<=n;++j)
                {
                    if(j==k||j==i)
                        continue;
                    if(a[i][j]>a[i][k]+a[k][j])        //更新最短路和重要城市 
                    {
                        a[i][j]=min(a[i][j],a[i][k]+a[k][j]);
                        key[i][j]=k;
                    }
                    else
                        if(a[i][j]==a[i][k]+a[k][j])    //有多条最短路,不存在重要城市 
                            key[i][j]=0;
                }
            }
        bool have=0;
        for(int i=1;i<n;++i)
            for(int j=i+1;j<=n;++j)
                if(key[i][j])    //找重要城市 
                    flag[key[i][j]]=1,have|=flag[key[i][j]];
        if(!have)
        {
            puts("No important cities.");
        }
        else
            for(int i=1;i<=n;++i)
                if(flag[i])
                    printf("%d ",i);
        return 0;
    }
  • 相关阅读:
    POJ3714+最近点对
    HDU1632+半平面交
    POJ2402+模拟
    ASP.NET MVC几种找不到资源的问题解决办法
    ASP.NET MVC中的错误-友好的处理方法
    ASP.NET MVC 程序 报错“CS0012: 类型“System.Data.Objects.DataClasses.EntityObject”在未被引用的程序集中定义”的解决办法
    【Reporting Services 报表开发】— 表达式
    【Reporting Services 报表开发】— 级联式参数设置
    【Reporting Services 报表开发】— 数据表的使用
    【Reporting Services 报表开发】— 矩阵的使用
  • 原文地址:https://www.cnblogs.com/lovewhy/p/8476994.html
Copyright © 2011-2022 走看看