zoukankan      html  css  js  c++  java
  • 【NOIP模拟】旅程

    题面

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

    对于 30% 的数据:n,m ≤ 10
    对于 50% 的数据:n,m ≤ 50
    对于 100% 的数据:n ≤ 200,m ≤ 100000, 操作 1 不超过 200 次,边权不超过 10000

    分析

    Floyd,又是删边转换成加边。

    每次加一条边,只用这一条边去松弛这张图。

    因为一条边会被多次删除,所以删边的时候记录一下当前边权,后来加边的时候用这个当前边权松弛。

    代码

    1. #include<bits/stdc++.h>  
    2. using namespace std;  
    3. #define N 220  
    4. #define M 200010  
    5. #define ll long long  
    6. #define INF 123456789  
    7. ll n,m,cnt;  
    8. ll e[N][N],w[M],x[M],y[M],op[M],ans[M];  
    9. template<class T>    
    10. inline void read(T &x)    
    11. {    
    12.     x=0;    
    13.     static char c=getchar();    
    14.     while(c<'0'||c>'9') c=getchar();    
    15.     while(c>='0'&&c<='9')    
    16.     x=x*10+c-'0',c=getchar();    
    17. }     
    18. int main()  
    19. {  
    20.     read(n);read(m);  
    21.     for(ll i=1;i<=n;i++)  
    22.         for(ll j=1;j<=n;j++)  
    23.             read(e[i][j]);  
    24.               
    25.     for(ll i=1;i<=m;i++)  
    26.     {  
    27.         read(op[i]),read(x[i]),read(y[i]);  
    28.         if(op[i]==1)  
    29.         {  
    30.             w[i]=e[x[i]][y[i]];  
    31.             e[x[i]][y[i]]=INF;  
    32.         }  
    33.     }  
    34.     for(ll k=1;k<=n;k++)  
    35.         for(ll i=1;i<=n;i++)  
    36.             for(ll j=1;j<=n;j++)  
    37.                 e[i][j]=min(e[i][j],e[i][k]+e[k][j]);     
    38.       
    39.       
    40.     for(ll z=m;z>=1;z--)   
    41.     {  
    42.         if(op[z]==1)  
    43.         {  
    44.             for(ll i=1;i<=n;i++)  
    45.                 for(ll j=1;j<=n;j++)  
    46.                     e[i][j]=min(e[i][j],e[i][x[z]]+e[y[z]][j]+w[z]);      
    47.         }  
    48.         else  
    49.             ans[++cnt]=e[x[z]][y[z]];  
    50.     }  
    51.     for(ll i=cnt;i>=1;i--)  
    52.     {  
    53.         if(ans[i]>=INF)printf("-1 ");  
    54.         else printf("%lld ",ans[i]);  
    55.     }     
    56.     return 0;  
    57. }  
  • 相关阅读:
    数字加密
    大道至简第四章读后感
    输出类中的对象个数
    大道至简第三章读后感
    02java语法基础问题总结
    从命令行接收多个数字并求和输出
    软件工程个人作业03
    第四周学习进度条
    软件工程概论-课后作业2(单元测试)
    第三周学习进度
  • 原文地址:https://www.cnblogs.com/NSD-email0820/p/9849686.html
Copyright © 2011-2022 走看看