简单dp
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define MAX 210
using namespace std;
int n,m,l,path[MAX],graph[MAX][MAX],dp[MAX][MAX];
void init(){
cin>>n>>m;
memset(graph,0,sizeof(graph));
int a,b;
for(int i=0;i<m;i++){
cin>>a>>b;
graph[a][b]=graph[b][a]=1;
}
for(int i=1;i<=n;i++)
graph[i][i]=1;
cin>>l;
for(int i=1;i<=l;i++){
cin>>path[i];
}
memset(dp,0x7f,sizeof(dp));
for(int i=1;i<=l;i++)
dp[1][i]=1;
dp[1][path[1]]=0;
}
void solve(){
for(int i=2;i<=l;i++){
for(int j=1;j<=n;j++){
for(int t=1;t<=n;t++){
if(graph[j][t])
dp[i][j]=min(dp[i][j],dp[i-1][t]+((j==path[i])?0:1));
}
}
}
int ans=0x7f7f7f7f;
for(int i=1;i<=n;i++)
ans=min(ans,dp[l][i]);
cout<<ans<<endl;
}
int main(){
int T;
scanf("%d",&T);
while(T--){
init();
solve();
}
return 0;
}
UVA 1424 Salesmen
最新推荐文章于 2016-12-20 17:10:47 发布