H - Weekend
利用floyd求出
多源最短路到各个点的最短路径,
#include<bits/stdc++.h> using namespace std; #define inf 0x3f3f3f3f #define maxn 105 int mmp[maxn][maxn]; int fri[maxn]; int t,n,m,f,u,v,w; long long ans,temp; void floyd() { for(int k=1; k<=n; k++) for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) if(mmp[i][k]+mmp[k][j]<mmp[i][j]) mmp[i][j]=mmp[i][k]+mmp[k][j]; } void init () { cin>>n>>m>>f; for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) if(i==j)mmp[i][j]=0; else mmp[i][j]=inf; while(m--) { cin>>u>>v>>w; if(w<mmp[u][v]) mmp[u][v]=mmp[v][u]=w; } for(int i=0; i<f; i++) cin>>fri[i]; sort(fri,fri+f); ans=inf; } int main() { cin>>t; for(int cnt=1; cnt<=t; cnt++) { init(); floyd(); do { temp=0; temp+=mmp[1][fri[0]]; for(int i=0; i<f-1; i++) temp+=mmp[fri[i]][fri[i+1]]; temp+=mmp[fri[f-1]][n]; ans=min(ans,temp); } while(next_permutation(fri,fri+f)); cout<<"Case "<<cnt<<": "; cout<<ans<<endl; } return 0; }