hdu 3001 dp 状态压缩 3进制

来源:互联网 发布:ie加载项中没有java 编辑:程序博客网 时间:2024/05/18 02:46

第一次做3进制的题 原理其实差不多,不过要多几个特判 又长姿势了。。。。

#include <iostream>#include <cstring>using namespace std;#define INF 0x3f3f3f3fint map[12][12];int dp[60000][12];int vis[60000][12];int dig[12];int minn;void init(int n){    dig[0]=1;    for(int i=1; i<=n; i++)        dig[i]=dig[i-1]*3;    for(int i=0; i<=dig[n]; i++)    {        int p=i;        for(int j=1; j<=10; j++)        {            vis[i][j]=p%3;            p/=3;        }    }}int main(){    int n,m,a,b,c;    init(10);    while(cin>>n>>m)    {        minn=INF;        memset(dp,INF,sizeof(dp));        memset(map,INF,sizeof(map));        int w=dig[n];        while(m--)        {            cin>>a>>b>>c;            map[a][b]=map[b][a]=min(map[a][b],c);        }        for(int i=1; i<=n; i++)            dp[dig[i-1]][i]=0;        for(int i=0; i<w; i++)        {            int ans=1;            for(int j=1; j<=n; j++)            {                if(vis[i][j]==0)                    ans=0;                if(dp[i][j]==INF)                    continue;                for(int k=1; k<=n; k++)                {                    if(j==k||map[k][j]==INF||vis[i][k]>=2)                        continue;                    dp[i+dig[k-1]][k]=min(dp[i][j]+map[j][k],dp[i+dig[k-1]][k]);                }            }            if(ans)            {                for(int j=1; j<=n; j++)                {                    if(minn>dp[i][j])                        minn=dp[i][j];                }            }        }        if(minn==INF)            cout<<-1<<endl;        else            cout<<minn<<endl;    }    return 0;}


0 0