• 【最短路/floyd模板】旅途


    题目描述

    您曾经带领着我,穿过我的白天的拥挤不堪的旅程,而到达了我的黄昏的孤寂之境。在通宵的寂静里,我等待着它的意义。

    神即将带领一些人去他们的孤寂之境,由于这个世界的不稳定,地点之间的有向道路会不定期地毁坏,出于工作准备,神想知道在某些道路毁坏之后某两点之间的最短路。
    就是给定一个有向图,现有两个操作,操作 1 是删除一条边(一条边可重复删除),操作 2是询问两个点之间的最短路。

    输入

    第1行两个正整数n,m,分别表示图的点数和操作数。
    第2行至第n+1行每行n个正整数,为图的邻接矩阵,第i行第j列的数表示点i和点j间距离,保证对角线为0。
    接下来m行每行三个正整数c,x,y,c表示操作种类,为1或2,当c=1时表示删除x与y相连的边,当c=2时表示询问x到y的最短路,若不可达则输出−1。

    输出

    输出若干行,每个2操作对应一行,答案为询问中x到y的最短路或−1
    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    const int INF=1e9;
    int n,m;
    int mp[205][205];
    int vis[205][205];
    struct node
    {
        int f,u,v;
        int len;
    }c[100005];
    int main()
    {
        scanf("%d %d",&n,&m);
        for(int i=1;i<=n;++i)
        {
            for(int j=1;j<=n;++j)
            {
                scanf("%d",&mp[i][j]);
            }
        }
        for(int i=1;i<=m;++i)
        {
            scanf("%d %d %d",&c[i].f,&c[i].u,&c[i].v);
            if(c[i].f==1)
            {
                c[i].len=mp[c[i].u][c[i].v];
                mp[c[i].u][c[i].v]=INF;
                vis[c[i].u][c[i].v]++;
            }
        }
        for(int k=1;k<=n;++k)
        {
            for(int i=1;i<=n;++i)
            {
                for(int j=1;j<=n;++j)
                {
                    mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);
                }
            }
        }
        //cout<<mp[4][1]<<endl;
        int ant[100005];
        for(int i=m;i>=1;--i)
        {
            if(c[i].f==1)
            {
                --vis[c[i].u][c[i].v];
                if(!vis[c[i].u][c[i].v]){
                int cnt=min(mp[c[i].u][c[i].v],c[i].len);
                for(int a=1;a<=n;a++)
                {
                    for(int b=1;b<=n;b++)
                    {
                        mp[a][b]=min(mp[a][b],mp[a][c[i].u]+cnt+mp[c[i].v][b]);
                    }
                }
                }
            }
            else
            {
                if(mp[c[i].u][c[i].v]<INF)
                {
                    ant[i]=mp[c[i].u][c[i].v];
                }
                else
                {
                    ant[i]=-1;
                }
            }
        }
        for(int i=1;i<=m;++i)
        {
            if(c[i].f==2){
            printf("%d
    ",ant[i]);
            }
        }
        return 0;
    }
  • 相关阅读:
    Emmet使用
    正则参考网址
    sublime通用快捷键 汉化 安装 插件
    【真正福利】成为专业程序员路上用到的各种优秀资料、神器及框架
    生产事故的优化经历
    Windows下oracle打补丁步骤
    Oracle10g完全卸载正确步骤
    在windows2003系统上安装两个版本的oracle
    oracle11g数据库升级数据库升级
    oracle Imp和exp以及导入常见的错误
  • 原文地址:https://www.cnblogs.com/Diliiiii/p/10316932.html
Copyright © 2020-2023  润新知