LA4256 Salesmen

来源:互联网 发布:sql server 系统表 编辑:程序博客网 时间:2024/05/01 04:01

题目描述 传送门


太久没做题了,一道简单DP折腾了半天。
d(i,j)为前i个结尾为j需要变多少下。

代码

#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>using namespace std;bool g[110][110];int a[210],d[210][110];int main(){    int t;    cin>>t;    while(t--){        memset(g,0,sizeof(g));        int n,m,l;        cin>>n>>m;        for(int i=1;i<=n;i++) g[i][i]=1;         for(int i=0;i<m;i++){            int a,b;            scanf("%d%d",&a,&b);            g[a][b]=g[b][a]=1;        }        cin>>l;        for(int i=1;i<=l;i++) scanf("%d",&a[i]);        for(int i=1;i<=n;i++) d[1][i]=(a[1]==i)?0:1;        for(int i=2;i<=l;i++){            for(int j=1;j<=n;j++){                int u=(j==a[i])?0:1;                d[i][j]=1e9;                for(int k=1;k<=n;k++)                    if(g[k][j]) d[i][j]=min(d[i][j],d[i-1][k]+u);            }        }        int ans=1e9;        for(int i=1;i<=n;i++) ans=min(ans,d[l][i]);        cout<<ans<<endl;    }    return 0;}