标签: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