HDU 1595 find the longest of the shortest

题目让求删除某一条边之后的最短路的最差情况...只需要在没删除的时候找到最短路,最短路的某条边如果被删除的话,找到的最短路肯定比原先的长..如果存在的话,其他无用的边就算删除了也是最初的那个最短路,所以不用考虑。

写错了一个下标...一直RE,最后放弃重敲的时候发现,代码缝缝补补将就看。

path[i]=x数组记录的是选择最短路的时候记录的父节点。是从x到i这个边,然后一步一步回去遍历所有被选择的边。之所以用两个dijskstra是因为第一个要记录最短路路径...

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define inf 99999999
int g[1005][1005];
int dis[1005],used[1005],path[1005];
int n,m;
int dijk()
{
    int i,t,mini,x;
    for(i=1;i<=n;i++)
    {
        dis[i]=inf;
    }
    memset(used,0,sizeof(used));
    dis[1]=0;
    x=n-1;
    while(x--)
    {
        mini=inf;
        for(i=1;i<=n;i++)
        {
            if(dis[i]<mini&&!used[i])
            {
                mini=dis[i];
                t=i;
            }
        }
        if(mini==inf)
            break;
        used[t]=1;
        for(i=1;i<=n;i++)
        {
            if(!used[i]&&dis[i]>mini+g[t][i])
            {
                dis[i]=mini+g[t][i];
                path[i]=t;
            }
        }
    }
    return dis[n];

}
int dij()
{
    int i,t,mini,x;
    for(i=1;i<=n;i++)
        dis[i]=inf;
    memset(used,0,sizeof(used));
    dis[1]=0;
    x=n-1;
    while(x--)
    {
        mini=inf;
        for(i=1;i<=n;i++)
        {
            if(dis[i]<mini&&!used[i])
            {
                mini=dis[i];
                t=i;
            }
        }
        if(mini==inf)
            break;
        used[t]=1;
        for(i=1;i<=n;i++)
        {
            if(!used[i]&&dis[i]>mini+g[t][i])
            {
                dis[i]=mini+g[t][i];
            }
        }
    }
    return dis[n];
}
int main()
{
    int i,j,a,b,v;
    while(scanf("%d %d",&n,&m)!=EOF)
    {
        memset(path,0,sizeof(path));
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
            {
                if(i==j)
                    g[i][j]=g[j][i]=0;
                else
                    g[i][j]=g[j][i]=inf;
            }

        for(i=0;i<m;i++)
        {
            scanf("%d %d %d",&a,&b,&v);
            if(g[a][b]>v)
                g[a][b]=g[b][a]=v;
        }
        int ans=dijk();
        int x=n;
        while(x!=1)
        {
            int a=path[x];
            int tep=g[x][a];
            g[x][a]=g[a][x]=inf;
            int t=dij();
            if(t>ans&&t<inf)
                ans=t;
                g[x][a]=g[a][x]=tep;
            x=a;
        }
        printf("%d\n",ans);
    }
    return 0;
}


你可能感兴趣的:(最短路,dijskstra)