uva 10604 Chemical Reaction

dp,dp!!!

#include <iostream>

#include<cstdio>

#include<cstring>

#define N 11

#define INF 0x3f3f3f3f

using namespace std;

int dp[N][N][N][N][N][N];

struct node

{

    int res;

    int v;

}mat[N][N];

int t,m;

int DP(int *n)

{

    int &d=dp[n[1]][n[2]][n[3]][n[4]][n[5]][n[6]];

    if(d!=INF)

    return d;



    int total=n[1]+n[2]+n[3]+n[4]+n[5]+n[6];

    if(total==1)

    return d=0;



    for(int i=1;i<=m;i++)

    for(int j=1;j<=m;j++)

    {

        int k=mat[i][j].res;

        n[i]--,n[j]--;



        if(n[i]>=0&&n[j]>=0)

        {

            n[k]++;

            d=min(d,DP(n)+mat[i][j].v);

            n[k]--;

        }



        n[i]++,n[j]++;

    }

    return d;

}



int main()

{

    while(scanf("%d",&t)==1)

    {

        bool ok=false;

        while(t--)

        {

            scanf("%d",&m);

            for(int i=1;i<=m;i++)

            for(int j=1;j<=m;j++)

            scanf("%d%d",&mat[i][j].res,&mat[i][j].v);

            int st[7]={0},k;

            scanf("%d",&k);

            for(int i=0;i<k;i++)

            {

                int t;

                scanf("%d",&t);

                st[t]++;

            }

            memset(dp,INF,sizeof(dp));

            char s[2];

            scanf("%s",s);

            if(s[0]=='.')

            ok=true;

            printf("%d\n",DP(st));

        }

        if(ok)

        break;

    }

    return 0;

}

  

你可能感兴趣的:(action)