hdu3986Harry Potter and the Final Battle

给你一个无向图,然后找出其中的最短路,

除去最短路中的任意一条边,看最糟糕的情况下,

新的图中,第一个点到末点的最短路长度是多少。

我的做法是:

首先找出最短路,然后记录路径,

再一条一条边的删,

删一条算一下最短路长度,

之后恢复这条边,删掉下一条边继续算,

以此类推。

看之中最糟糕的情况下,最短路长度是多少,

如果是无穷大则代表最坏情况为不通,按题意输出-1即可,

否则输出最坏情况下,最短路长度。

我用spfa和链式向前星做的,

代码如下:

#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
bool flag;
int exp,num_dot,num_side,cnt,pd[1010],ps[1010],die[100010],dis[1010],box[1010];
struct node
{
    int to,next,w,co;
}side[100010];
void add(int from,int to,int w)
{
    side[cnt].to=to;
    side[cnt].w=w;
    side[cnt].next=box[from];
    box[from]=cnt++;
}
void init()
{
    int s,e,w;
    cnt=0;
    flag=1;
    memset(box,-1,sizeof(box));
    memset(die,0,sizeof(die));
    scanf("%d%d",&num_dot,&num_side);
    for(int i=0;i<num_side;i++)
    {
        scanf("%d%d%d",&s,&e,&w);
        side[cnt].co=cnt+1;
        add(s,e,w);
        side[cnt].co=cnt-1;
        add(e,s,w);
    }
}
void spfa()
{
    int mid;
    bool iq[1010];
    queue<int>qq;
    memset(iq,0,sizeof(iq));
    memset(dis,127,sizeof(dis));
    dis[1]=0;
    qq.push(1);
    iq[1]=1;
    while(qq.size())
    {
        mid=qq.front();
        qq.pop();
        iq[mid]=0;
        for(int i=box[mid];i>-1;i=side[i].next)
            if(die[i]==0&&dis[side[i].to]>dis[mid]+side[i].w)
            {
                dis[side[i].to]=dis[mid]+side[i].w;
                if(flag)
                {
                    pd[side[i].to]=mid;
                    ps[side[i].to]=i;
                }
                if(!iq[side[i].to])
                {
                    iq[side[i].to]=1;
                    qq.push(side[i].to);
                }
            }
    }
    flag=0;
}
int main()
{
    int ans;
    scanf("%d",&exp);
    while(exp--)
    {
        init();
        spfa();
        if(dis[num_dot]>50000000)
            printf("-1\n");
        else
        {
            ans=0;
            for(int i=num_dot;i>1;i=pd[i])
            {
                die[ps[i]]=1;
                die[side[ps[i]].co]=1;
                spfa();
                ans=max(ans,dis[num_dot]);
                die[ps[i]]=0;
                die[side[ps[i]].co]=0;
            }
            if(ans>50000000)
                printf("-1\n");
            else
                printf("%d\n",ans);
        }
    }
}

hdu3986Harry Potter and the Final Battle,布布扣,bubuko.com

时间: 2024-10-26 08:53:36

hdu3986Harry Potter and the Final Battle的相关文章

HDU3986Harry Potter and the Final Battle(SPFA册边)

Harry Potter and the Final Battle Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 2666    Accepted Submission(s): 761 Problem Description The final battle is coming. Now Harry Potter is located

hdu 3986 Harry Potter and the Final Battle

Harry Potter and the Final Battle Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 3319    Accepted Submission(s): 936 Problem Description The final battle is coming. Now Harry Potter is located

hdu 3986 Harry Potter and the Final Battle spfa变形

#include<stdio.h> #include<string.h> #include<queue> #include<vector> using namespace std; const int N=1024; const int inf=0x7fffffff; struct Edge { int u,v,w,use,del; }; vector<Edge>edge; vector<int>G[N]; int n,m,dist[

【Dijstra堆优化】HDU 3986 Harry Potter and the Final Battle

http://acm.hdu.edu.cn/showproblem.php?pid=3986 [题意] 给定一个有重边的无向图,T=20,n<=1000,m<=5000 删去一条边,使得1~n的最短路最长 求最短路最长是多少 [思路] 一定是删最短路上的边 可以先跑一个Dijkstra,求出最短路,然n后枚举删边 朴素的Dijkstra为n^2,枚举删边(n条)需要的总时间复杂度是n^3 堆优化Dijkstra(nlogn),总复杂度为n^2logn 有多重边,用邻接矩阵不方便,用邻接表方便,

题单二:图论500

http://wenku.baidu.com/link?url=gETLFsWcgddEDRZ334EJOS7qCTab94qw5cor8Es0LINVaGMSgc9nIV-utRIDh--2UwRLvsvJ5tXFjbdpzbjygEdpGehim1i5BfzYgYWxJmu ==========  以下是最小生成树+并查集=========================[HDU]1213         How Many Tables        基础并查集★1272         小

图论五百题!

生死看淡不服就淦,这才是人生! =============================以下是最小生成树+并查集======================================[HDU]1213 How Many Tables 基础并查集★1272 小希的迷宫 基础并查集★1325&&poj1308 Is It A Tree? 基础并查集★1856 More is better 基础并查集★1102 Constructing Roads 基础最小生成树★1232 畅通工程 基

图论 500题——主要为hdu/poj/zoj

转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并查集======================================[HDU]1213   How Many Tables   基础并查集★1272   小希的迷宫   基础并查集★1325&&poj1308  Is It A Tree?   基础并查集★1856   More i

图论精炼500题

忘了从哪转的了... =============================以下是最小生成树+并查集====================================== [HDU] 1213               How Many Tables                    基础并查集★ 1272               小希的迷宫                     基础并查集★ 1325&&poj1308    Is It A Tree?       

hdu图论题目分类

=============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many Tables 基础并查集★ 1272 小希的迷宫 基础并查集★ 1325&&poj1308 Is It A Tree? 基础并查集★ 1856 More is better 基础并查集★ 1102 Constructing Roads 基础最小生成树★ 1232 畅通工程 基础并查集★ 123