标签:map bottom row health mes find route mat tput
#include<bits/stdc++.h> using namespace std; const int INF=0x3f3f3f3f; const int N=55,M=110,maxn=10010; int T,n,m,q,u,v,w,s,t,K; int a[maxn][N][N],b[maxn][N][N],Map[N][N]; int flag[N][N],dis[N][N]; void pre_work(int x[N][N],int y[N][N],int z[N][N]) { for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { flag[i][j]=INF; for(int k=0;k<n;k++) flag[i][j]=min(flag[i][j],x[i][k]+y[k][j]); } } for(int i=0;i<n;i++) for(int j=0;j<n;j++) z[i][j]=flag[i][j]; } int main() { ios::sync_with_stdio(false); cin.tie(0); cin>>T; while(T--) { cin>>n>>m; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) Map[i][j]=INF; } while(m--) { cin>>u>>v>>w; Map[u-1][v-1]=min(Map[u-1][v-1],w); } for(int i=0;i<n;i++) { for(int j=0;j<n;j++) a[0][i][j]=b[0][i][j]= i==j? 0:INF; } for(int i=1;i<M;i++) pre_work(a[i-1],Map,a[i]);//处理出经过i步从 x->y 的最短路 for(int i=1;i<M;i++) pre_work(b[i-1],a[100],b[i]);//处理出从 x->y 恰好走 100*i步 //Floyd for(int i=0;i<n;i++) { for(int j=0;j<n;j++) dis[i][j]= i==j? 0:Map[i][j]; } for(int k=0;k<n;k++) { for(int i=0;i<n;i++) { for(int j=0;j<n;j++) dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]); } } for(int x=0;x<M;x++) { for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { flag[i][j]=INF; for(int k=0;k<n;k++) flag[i][j]=min(flag[i][j],b[x][i][k]+dis[k][j]); } } for(int i=0;i<n;i++) for(int j=0;j<n;j++) b[x][i][j]=flag[i][j]; } cin>>q; while(q--) { cin>>s>>t>>K; s--,t--; int r=K/100,l=K%100,ans=INF; for(int i=0;i<n;i++) ans=min(ans,b[r][s][i]+a[l][i][t]); if(ans>=INF) cout<<-1<<endl; else cout<<ans<<endl; } } return 0; }
2018HDU多校训练-3-Problem M. Walking Plan
标签:map bottom row health mes find route mat tput
原文地址:https://www.cnblogs.com/songorz/p/9398584.html