UVALive 6450 Social Advertising DFS解法
2014-08-02 14:00
225 查看
题意:一些人有朋友关系,在某个人的社交网站上投放广告可以被所有该人的直接朋友看到,问最小投放多少个广告使给出的人都看到广告。(n<=20)
解法:看到n的范围可以想到用二进制数表示每个人被覆盖与否,所以可以依次为状态进行搜索,每次枚举一个人,投放广告,然后将他的朋友覆盖,用dis记录步数,记忆化搜索。
代码:
View Code
解法:看到n的范围可以想到用二进制数表示每个人被覆盖与否,所以可以依次为状态进行搜索,每次枚举一个人,投放广告,然后将他的朋友覆盖,用dis记录步数,记忆化搜索。
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #define Mod 1000000007 using namespace std; #define N 100007 int mp[22][22]; int mstep,n,S; int tag; int dis[1103300]; void dfs(int state,int step) { int i; dis[state] = step; if(state == S) { mstep = min(mstep,step); return; } for(int i=0;i<n;i++) { //if((state&(1<<i)) == 0) //不要,因为这个点可以是被覆盖的,还可以再放 //{ int tmp = state|(1<<i); for(int j=0;j<n;j++) { if(mp[i][j] && (tmp&(1<<j)) == 0) { tmp|=(1<<j); } } if(!dis[tmp] || step+1 < dis[tmp]) { dfs(tmp,step+1); } //} } } int main() { int t,i,k,j,x; scanf("%d",&t); while(t--) { scanf("%d",&n); S = (1<<n)-1; memset(mp,0,sizeof(mp)); memset(dis,0,sizeof(dis)); for(i=0;i<n;i++) { scanf("%d",&k); for(j=0;j<k;j++) { scanf("%d",&x); mp[i][x-1] = 1; mp[x-1][i] = 1; } } mstep = Mod; dfs(0,0); printf("%d\n",mstep); } return 0; }
View Code
相关文章推荐
- UVALive 6450 Social Advertising DFS解法
- UVALIVE 6450 Social Advertising
- 宇航员分组(uvalive 3713)
- 【暑假】[实用数据结构]UVAlive 4329 Ping pong
- uvalive 3135 Argus
- UVALive 6844 Combination(组合数学)
- UVAlive3713 Astronauts(2-SAT)
- UVALive 6495 Probability Paradox AC自动机+高斯消元
- UVALive 3971 组装电脑
- uvalive3938 “Ray, Pass me the dishes!”
- UVALive 3351 Easy and Not Easy Sudoku Puzzles 位运算~判断简单数独
- UVAlive 6693 Flow Game(模拟)
- UVaLive 6805 Pantun Grader (恶心的模拟)
- UVaLive 6602 Counting Lattice Squares (找规律)
- POJ1060 HDU1343 ZOJ1026 UVALive2323 Modular multiplication of polynomials题解
- UVALive 6862 Triples (找规律 暴力)
- UVALive 5903 Piece it together 二分匹配,拆点 难度:1
- UVALive 4960 Sensor network(MST+LCA)
- UVALive 6465--UVALive 6473(2014省赛练习)
- UVAlive-3363 String Compression