热点营销-1

来源:互联网 发布:电子产品设计软件 编辑:程序博客网 时间:2024/06/05 06:00
  • 在当前的IT环境中,引流成本是非常昂贵的,一个电商网站获取1个用户的成本一般在0.7-1.0rmb左右,一个游戏就更高啦~因此,如何以最低的消耗获得流量是每个互联网公司都会面临的问题。
  • 其中有一种非常低廉的营销手段就是通过微信的朋友圈,制造热点话题,疯狂转发。比如前阵子大名鼎鼎的爆红小游戏神经猫,创下了在3天内被访问了1亿次的记录。
  • 对于营销来说,选取合适的种子用户传播是非常关键的。比如对于微博的大v营销。如果公司的预算只够请得起2个大v传播广告,那么请(姚晨,姚明)的选择明显好于请(姚晨,范冰冰)。因为(姚晨,范冰冰的粉丝基本一致,而姚明和姚晨是跨界的,粉丝交集没那么多)。
  • 现在的问题来了,这是100个微信用户的关系列表(为了方便表达,把名字变成一个整数,这100个用户的名字分别为1-100,每行有两个名字,代表这两人互为微信好友),你需要使一个广告让这100个微信用户都看到,请问初始至少将这条广告传播个几个人?(这条广告编写得很精美,因此用户们看到一定会转发在他的朋友圈让他的朋友看到的)。

 举例:下面是7个人的关系列表,问小明若要使A信息完全覆盖这7个人,初始至少要传播给几个人? 假设7个人A,B,C,D,E,F,G A和B是好友 B和C是好友 C和D是好友 E和F是好友 G由于性格怪癖没有朋友。 那么小明至少要将A信息传播给3个人,才能让这7个人都能收到热点消息(A,B,C,D中的一个,E,F中的一个,外加G)。答案为3。


题目就是求无向图的连通分量的个数.

这个是以前写过的代码改的。

#include<stdio.h>#include<stdlib.h>#include<iostream>#include<vector>#include<stack>using namespace std;int n,m;void DFS(int **a,int v,int *k,int *visit){     stack<int>s;     int top=-1,j;     (*k)++;     visit[v]=1;     s.push(v);     while(!s.empty()){         v=s.top();         for(j=1;j<=n;j++){             if(a[v][j]==1&&visit[j]==0){                 (*k)++;                 visit[j]=1;                 s.push(j);                 break;             }             if(j==n)                s.pop();         }     }}int main(){     freopen("F:\demo\\123.txt","r",stdin);     scanf("%d %d",&n,&m);     int *visit=(int *)malloc((n+1)*sizeof(int));     int **a=(int **)malloc((n+1)*sizeof(int*));     int e,f;     for(e=0;e<=n;e++){         a[e]=(int *)malloc(sizeof(int)*(n+1));     }     for(e=1;e<=n;e++)         for(f=1;f<=n;f++)             a[e][f]=0;     for(e=1;e<=n;e++)          visit[e]=0;     for(int i=1;i<=m;i++){          scanf("%d%d",&e,&f);    //      printf("%d %d\n",e,f);          a[e][f]=1;          a[f][e]=1;      }      int k=0;      int sum=0;      int *b=(int *)malloc((n+1)*sizeof(int));      DFS(a,1,&k,visit);      sum++;      b[0]=k;      e=1;      for(int v=1;v<=n;v++){          k=0;          if(visit[v]==0){              DFS(a,v,&k,visit);              sum++;              b[e]=k;              e++;          }      }      printf("%d\n",sum);      int t;      for(int i=0;i<sum;i++){          printf("%d ",b[i]);//b[i]为每个连通分量的结点个数      }      printf("\n");      return 0;}

这个题目用并查集做其实更简单,代码如下:

#include<iostream>#include<cstdio>using namespace std;int p[111];int find(int x){    if(x!=p[x])      p[x]=find(p[x]);     return p[x];}void unions(int x,int y){    p[x]=y;}int main(){    int T,a,b,x,y,n,m;   // freopen("F:\demo\\123.txt","r",stdin);    cin>>n>>m;    for(int i=1;i<=n;i++)    p[i]=i;    for(int i=0;i<m;i++)    {        cin>>a>>b;        x=find(a);        y=find(b);        if(x!=y)        unions(x,y);    }    int ans=0;    for(int i=1;i<=n;i++)    if(p[i]==i) ans++;    cout<<ans<<endl;}


0 0