随笔 - 531  文章 - 0  评论 - 3  阅读 - 10215 

给定一个长度为 n1 ( n1100 ) 的点的无向连通图和一个长度为 n 的序列 A ( n200 ) ,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();
 }
 
 
复制代码

 

posted on   towboat  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示