给定一个长度为 n1 ( n1≤100 ) 的点的无向连通图和一个长度为 n 的序列 A ( n≤200 ) ,1<=A[i]<=n1
希望修改尽量少的数,使得序列的任意相邻两个数在图上是是相邻节点,或者相同
n<=100 ,直接暴力
枚举位置i,i-1 的值, 那么就可以转移
如果 k==j ,g[k][j]=1
f[i][j] = min( f[i-1][k]+1 )
= min(f[i-1][k]) , j==a[i]
#include <iostream> #include <algorithm> #include <cstring> using namespace std; const int N=400,inf=1e9; int n1,m,n; int g[N][N],a[N],f[N][N]; void solve(){ int x,y,i,j,k; cin>>n1>>m; memset(g,0,sizeof g); for(i=1;i<=n1;i++) g[i][i]=1; for(i=1;i<=m;i++) cin>>x>>y,g[x][y]=g[y][x]=1; cin>>n; for(i=1;i<=n;i++) cin>>a[i]; for(i=1;i<=n;i++) f[1][i]=1; f[1][a[1]]=0; for(i=2;i<=n;i++){ for(j=1;j<=n1;j++){ f[i][j]=inf; for(k=1;k<=n1;k++) if(g[j][k]) { if(j==a[i]) f[i][j]=min(f[i][j],f[i-1][k]); else f[i][j]=min(f[i][j],f[i-1][k]+1); } } } int ans=inf; for(i=1;i<=n1;i++) ans=min(ans,f[n][i]); cout<<ans<<endl; } int main(){ int cas; cin>>cas; while(cas--) solve(); }
标签:1424,int,cas,n1,uva,include From: https://www.cnblogs.com/towboa/p/16834769.html