zoukankan      html  css  js  c++  java
  • SSLZYC 道路阻塞

    题目大意:
    给定一个连通图,求将任意一条路的距离翻倍,在最短时间的情况下最多可以浪费多少时间?


    思路:
    这道题是一道最短路的题目,由于数据很小,我们可以用两个弗洛伊德算法,第一个求出不翻倍的情况下所需的时间,第二个求出翻倍的情况下所需的时间。然后将两数相减,得出结果。
    在弗洛伊德算法的进行同时,我们也要记录路径,求出最短路中最长的一条,将这条路的长度翻倍。


    代码:

    #include <cstdio>
    #include <iostream>
    #define N 501
    using namespace std;
    
    int a[N][N],b[N][N],n,m,maxn,x,y,p,q,c[N][N];
    
    void print(int x)  //递归求出最长的路
    {
        if (b[1][x]==0) return;
        print(b[1][x]);
        if (a[y][x]>maxn)
        {
            q=y;
            p=x;
            maxn=a[y][x];
        }
        y=x;
    }
    
    int main()
    {
        scanf("%d%d",&n,&m);
        for (int i=1;i<=n;i++)
         for (int j=1;j<=n;j++)
          c[i][j]=c[j][i]=a[i][j]=a[j][i]=99999999;  //初始化
        for (int i=1;i<=m;i++)
        {
            scanf("%d%d",&x,&y);
            scanf("%d",&a[x][y]);
            c[x][y]=c[y][x]=a[y][x]=a[x][y];
            b[x][y]=x;
            b[y][x]=y;   //记录前驱
        } 
        for (int k=1;k<=n;k++)
         for (int i=1;i<=n;i++)
          for (int j=1;j<=n;j++)  //弗洛伊德算法
           if (i!=j&&j!=k&&k!=i)
            if (a[i][j]>a[i][k]+a[k][j])
            {
                a[i][j]=a[i][k]+a[k][j];
                b[i][j]=b[k][j];  //改变前驱
            }
        b[1][1]=0;
        x=a[1][n];
        y=1;
        print(n);  //递归
        c[p][q]=c[q][p]=2*c[p][q];
        for (int k=1;k<=n;k++)
         for (int i=1;i<=n;i++)
          for (int j=1;j<=n;j++)  //又是一个弗洛伊德
           if (i!=j&&j!=k&&k!=i)
            if (c[i][j]>c[i][k]+c[k][j])
             c[i][j]=c[i][k]+c[k][j];
        printf("%d\n",c[1][n]-a[1][n]);   //输出答案
        return 0;
    }

    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .

    提示:本程序只能得90分,因为弗洛伊德算法有一个点在一个有两个最短路的图里,会计算前者的前驱,而正确答案在另一条路中,所以弗洛伊德会算错,正解要使用SPFA,可是我不想打SPFA。。。。。。

  • 相关阅读:
    高级(线性)素数筛
    Dijkstra(迪杰斯特拉)算法
    简单素数筛
    【解题报告】 POJ1958 奇怪的汉诺塔(Strange Tower of Hanoi)
    4 jQuery Chatting Plugins | jQuery UI Chatbox Plugin Examples Like Facebook, Gmail
    Web User Control Collection data is not storing
    How to turn on IE9 Compatibility View programmatically in Javascript
    从Javascrip 脚本中执行.exe 文件
    HtmlEditorExtender Ajax
    GRIDVIEW模板中查找控件的方式JAVASCRIPT
  • 原文地址:https://www.cnblogs.com/hello-tomorrow/p/9313128.html
Copyright © 2011-2022 走看看