【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\n");  
  54.         else printf("%lld\n",ans[i]);  
  55.     }     
  56.     return 0;  
  57. }  
posted @ 2018-10-25 14:35  WJEMail  阅读(208)  评论(0编辑  收藏  举报