TopCoder SRM 696
来源:互联网 发布:程序员三年薪资2017 编辑:程序博客网 时间:2024/06/13 01:11
给了20条边,最多会涉及到40个点。我们可以先贪心把那些肯定不会影响结果的点先染色(比如度为0的点和度为1的点,如果一条边连接的两个点度都是1,那么先只染一个,不然会有花费)。贪心过后,最多剩下20个点,这样就可以状压dp了。
#include <bits/stdc++.h>using namespace std;#define ll long longint deg[55];bool vis[55];int vec[105];int dp[(1<<20) + 10];const int INF = 1e9;class Gperm{public: int countfee(vector <int> x, vector <int> y){ int sz = x.size(); for(int i=0;i<sz;i++){ deg[x[i]] ++; deg[y[i]] ++; } int k = 0; for(int i=0;i<50;i++){ if(deg[i]==0){ vis[i] = 1; } } for(int i=0;i<sz;i++){ if(deg[x[i]]==1){ vis[x[i]] = 1; vec[k++] = (y[i]); }else if(deg[y[i]]==1){ vis[y[i]] = 1; vec[k++] = (x[i]); }else if(deg[x[i]]>1 && deg[y[i]]>1){ vec[k++] = x[i]; vec[k++] = y[i]; } } sort(vec,vec+k); k = unique(vec,vec+k) - vec; int End = (1<<k); for(int i=1;i<End;i++){ dp[i] = INF; int cur = 0; for(int j=0;j<k;j++){ if(i & (1<<j)){ vis[vec[j]] = 1; } } for(int j=0;j<sz;j++){ if( (vis[x[j]] ) && (vis[y[j]] ) ){ cur++; } } for(int j=0;j<k;j++){ if(i&(1<<j)){ dp[i] = min(dp[i],dp[i^(1<<j)] + cur); } } //undo for(int j=0;j<k;j++){ if(i & (1<<j)){ vis[vec[j]] = 0; } } } return dp[End-1]; }};
0 0
- TopCoder SRM 696
- topcoder srm 696 div2 Clicountingd2分析
- TopCoder SRM 281
- 第一次参加Topcoder SRM
- topcoder SRM 503报告
- topcoder SRM 506
- topcoder SRM 513 DIV2
- Topcoder SRM 495 - 513
- TopCoder SRM 543 DIV2
- topcoder-srm-233-div2
- Topcoder SRM 566 countJourneys
- TopCoder SRM 473 题解
- Topcoder SRM 573 WolfPackDivTwo
- Topcoder SRM Div2 Level2
- topcoder-srm-594
- Topcoder SRM 596
- TopCoder SRM 607 题解
- TopCoder SRM 144 div2
- ListView常用拓展
- 滴滴打车校招
- 如何从oat文件中提取内嵌的dex文件
- 链表的插入和删除
- VB测不出来不 履行
- TopCoder SRM 696
- 线段树基本介绍
- Map ,HashMap , TreeMap , TreeMap 默认排序
- 工厂模式
- Android应用的入口点
- Codeforces702C【二分】
- ubuntu下安装pdf编辑器Master PDF Editor
- 网页调用Activex实现,ocx封装成cab文件
- POJ 2485 Highways(最小生成树变形+二分答案)