poj 2288 Islands and Bridges

來源:互聯網
上載者:User

標籤:style   blog   color   os   io   for   

題意: 給你一個雙向連通圖,求 獲得權值最大 的 哈密頓通路的 權值 和 這個權值對應的數目;

  其中權值計算方法是  列如 ABCD  權值是a+b+c+d+ab+bc+cd 如果 A,B,C  和B,C,D 可構成三角形分別加上abc,bcd;

這個題 和poj 3311  很相像: 那個需要記錄一個最後到達的地方   這個需要記錄倆個罷了

DP[i][a][b]其中 i  二進位 中1表示這個點走過了   最後走的的 的是b>>a

因為對於已經走過了{1,2,3,4,,5,6,..,N}  為了推出下一次走到X 我們要獲得權值 只和最後走的倆個點有關?

給出代碼::

 1 #include <cstdio> 2 #include <algorithm> 3 #include <cmath> 4 #include <cstdlib> 5 #include <cstring> 6 #include <iostream> 7 using namespace std; 8 long long  dp[1<<13][13][13]; 9 long long  num[1<<13][13][13];10 int n;11 int val[13];12 bool Map[13][13];13 void solve()14 {15     for(int i=0;i<(1<<n);i++)for(int a=0;a<n;a++)for(int b=0;b<n;b++)16     {17         if(!Map[a][b])continue;18         if(a==b)continue;19         if((i&(1<<a))==0||(i&(1<<b))==0)continue;20         if(i==((1<<a)+(1<<b)))21         {22             dp[i][a][b]=val[a]+val[b]+val[a]*val[b];23             num[i][a][b]=1;24             continue;25         }26         else27         {28             for(int c=0;c<n;c++)29             {30                 if(c==a||c==b||(!Map[b][c])) continue;31                 if((i&(1<<c))==0) continue;32                 long long  tmp;33                 if(dp[i^(1<<a)][b][c]==-1)continue;34                 if(Map[a][c]) tmp=val[a]+val[a]*val[b]+val[a]*val[b]*val[c];35                 else tmp=val[a]+val[a]*val[b];36                 if(dp[i][a][b]<dp[i^(1<<a)][b][c]+tmp)37                 {38                     num[i][a][b]=num[i^(1<<a)][b][c];39                     dp[i][a][b]=dp[i^(1<<a)][b][c]+tmp;40                 }41                 else if(dp[i][a][b]==dp[i^(1<<a)][b][c]+tmp)42                     num[i][a][b]+=num[i^(1<<a)][b][c];43             }44         }45     }46     long long  ans=-1;47     long long  ans_num=0;48     for(int b=0;b<n;b++) for(int c=0;c<n;c++)49     {50         if(ans<dp[(1<<n)-1][b][c])51         {52             ans=dp[(1<<n)-1][b][c];53             ans_num=num[(1<<n)-1][b][c];54         }55         else if(ans==dp[(1<<n)-1][b][c])56             ans_num+=num[(1<<n)-1][b][c];57 58     }59     if(ans==-1) printf("0 0\n");60     else printf("%lld %lld\n",ans,ans_num/2);61 }62 int main()63 {64     int q;65     scanf("%d",&q);66     while(q--)67     {68         memset(Map,false,sizeof(Map));69         memset(dp,-1,sizeof(dp));70         memset(num,0,sizeof(num));71         int m;72         scanf("%d%d",&n,&m);73         for(int i=0;i<n;i++)scanf("%d",&val[i]);74         for(int i=1;i<=m;i++)75         {76             int a,b;77             scanf("%d%d",&a,&b);78             a--,b--;79             Map[a][b]=Map[b][a]=true;80         }81         if(n==1) printf("%d 1\n",val[0]);82         else83         solve();84     }85     return 0;86 }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.