• 清北暑假模拟day2 之


    /*
    现场代码,枚举每条边删除
    */
    #include<iostream>
    #include<cstdio>
    #include<string>
    #include<cstring>
    #include<vector> 
    #include<queue>
    #include<algorithm>
    #define mx 1005
    
    using namespace std;
    struct orz
    {
        int d,p;
        friend bool operator <(orz a,orz b) {return a.d>b.d;}
    };
    struct Edge{
        int to;
        int w;
        int id;
    };
    priority_queue < orz > ss;
    int flag,cnt,v[mx],d[mx],n,m,l;
    vector<Edge> edge[mx];
    bool vis[mx];
    void input(){
        cin>>n>>l;
        int u,v,wei;
        Edge test;
        for(int i = 1;i <= l;i++){
            cin>>u>>v>>wei;
            if(u == v) continue;
            test.id = ++cnt;
            test.to = v;
            test.w = wei;
            edge[u].push_back(test);
            test.to = u;
            edge[v].push_back(test);
        }
        m = 1;
    }
    void dij(int s)
    {
        for(int i = 0;i < mx;i++) d[i] = 1000000000;
        d[s]=0;
        orz tmp;
        tmp.d=0,tmp.p=s;
        ss.push(tmp);
        flag++;
        int x,dd;
        Edge j;
        while (!ss.empty())
        {
            tmp=ss.top();
            ss.pop();
            x=tmp.p,dd=tmp.d;
            if (v[x]==flag) continue;
            v[x]=flag;
            for (int i = 0;i < edge[x].size();i++){
                if(vis[edge[x][i].id]) continue;
                j = edge[x][i];
                if (d[j.to]>dd+j.w)
                {
                    d[j.to]=dd+j.w;
                    tmp.d=dd+j.w,tmp.p=j.to;
                    ss.push(tmp);
                }
            }
    
        }
    }
    int main(){
        freopen("di.in","r",stdin);
        freopen("di.out","w",stdout);
        input();
        int ans = 0;
        for(int i = 1;i <= cnt;i++){
            vis[i] = true;
            dij(1);
            vis[i] = false;
            if(d[n] < 1000000000) ans = max(ans,d[n]);
        }
        cout<<ans;
        return 0;
    }
    /*
    要使最短路改变,就只能删除最短路经过的边
    */
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    
    using namespace std;
    
    const int maxn=210;
    const int maxm=50010;
    
    int n,m,en,f[maxn],q[maxn],dist[maxn],edg[maxm][3],z[maxn];
    
    bool use[maxn];
    
    struct edge
    {
        int e,d,id;
        edge *next;
    }*v[maxn],ed[maxm<<1],*fe[maxn];
    
    void add_edge(int id,int s,int e,int d)
    {
        en++;
        ed[en].next=v[s];v[s]=ed+en;v[s]->e=e;v[s]->d=d;v[s]->id=id;
    }
    
    void spfa()
    {
        int front=0,tail=1;
        memset(dist,0x3f,sizeof(dist));
        dist[1]=0;
        use[1]=true;
        q[0]=1;
        for (;front!=tail;)
        {
            int now=q[front++];
            if (front==maxn) front=0;
            use[now]=false;
            for (edge *e=v[now];e;e=e->next)
                if (dist[e->e]>dist[now]+e->d)
                {
                    dist[e->e]=dist[now]+e->d;
                    f[e->e]=now;fe[e->e]=e;
                    if (!use[e->e])
                    {
                        use[e->e]=true;
                        q[tail++]=e->e;
                        if (tail==maxn) tail=0;
                    }
                }
        }
    }
    
    int main()
    {
        freopen("di.in","r",stdin);
        freopen("di.out","w",stdout);
    
        scanf("%d%d",&n,&m);
        for (int a=1;a<=m;a++)
            scanf("%d%d%d",&edg[a][0],&edg[a][1],&edg[a][2]);
        for (int a=1;a<=m;a++)
        {
            add_edge(a,edg[a][0],edg[a][1],edg[a][2]);
            add_edge(a,edg[a][1],edg[a][0],edg[a][2]);
        }
        spfa();
        int cnt=0;
        for (int a=n;a!=1;a=f[a])
            z[++cnt]=fe[a]->id;
        int ans=-1;
        for (int a=1;a<=cnt;a++)
        {
            en=0;
            memset(v,0,sizeof(v));
            for (int b=1;b<=m;b++)
                if (b!=z[a])
                {
                    add_edge(b,edg[b][0],edg[b][1],edg[b][2]);
                    add_edge(b,edg[b][1],edg[b][0],edg[b][2]);
                }
            spfa();
            if (dist[n]!=0x3f3f3f3f) ans=max(ans,dist[n]);
        }
        printf("%d
    ",ans);
    
        return 0;
    }








  • 相关阅读:
    先装.NET SDK 后装IIS导致的错误
    proc
    C# FTP上传
    English Word
    Window服务程序
    DataView排序 疑惑
    移除字符串末尾制定个数字符
    树状列表
    updatepanel 中按钮下载文件出错解决
    如何删除vs最近打开的项目
  • 原文地址:https://www.cnblogs.com/hyfer/p/5978427.html
Copyright © 2020-2023  润新知