【codevs 1021】玛丽卡

来源:互联网 发布:vr核心算法 编辑:程序博客网 时间:2024/05/16 19:16

最短路问题。先找出1-n的最短路,依次把路上的一条路径去掉,求出并记录最短路,取最大值。
注意:去掉某一条路径时要先恢复上一条路径。

#include<cstdio>#include<queue>#include<iostream>#include<algorithm>#include<cstring>using namespace std;const int maxn=1000+5,maxm=500000+5;int n,m,s,t;bool vis[maxn],flag;int tot=0,first[maxn],next[maxm<<1],dis[maxn];int fa[maxn],fatot[maxm<<1];queue<int>q;struct edge{    int f,t,v;}es[maxm<<1];void build(int f,int t,int v){    es[++tot]=(edge){f,t,v};    next[tot]=first[f];    first[f]=tot;}void spfa(int s){    memset(vis,0,sizeof(vis));memset(dis,0x3f3f3f3f,sizeof(dis));            q.push(s);            dis[s]=0;            vis[s]=1;    while(!q.empty())    {        int v=q.front();        q.pop();        vis[v]=0;        for(int i=first[v];i;i=next[i])        {            int u=es[i].t;            if(dis[u]>dis[v]+es[i].v)            {                dis[u]=dis[v]+es[i].v ;                if(flag==1)                {                fatot[u]=i;//bian                fa[u]=v;//dian                }                if(!vis[u])                {                 q.push(u);                 vis[u]=1;                }            }        }    }}int main(){    memset(fa,0,sizeof(fa));    int a,b,c;    scanf("%d%d",&n,&m);    s=1;    t=n;    for(int i=1;i<=m;i++)    {        scanf("%d%d%d",&a,&b,&c);        build(a,b,c);        build(b,a,c);    }    flag=1;    spfa(s);    flag=0;    int ans=0;    for(int i=n;i!=1;i=fa[i])    {        int bian=fatot[i];        int dfg=es[bian].v;        es[bian].v=0x3f3f3f3f;            spfa(s);        ans=max(ans,dis[t]);        es[bian].v=dfg;    }    cout<<ans;    return 0;}
原创粉丝点击