去年写的,今年发一下。
社会网络
社会网络是指社会个体成员之间因为互动而形成的相对稳定的关系体系。社会网络以个人为节点(node)构成社会结构,人与人之间通过相互依赖关系联结起来。相互依赖关系可能是朋友关系、同学关系、生意伙伴关系、种族信仰关系等。一个社会网络可以用一张网络图来表示,其中节点(node)代表人,边(edge)代表人与人之间的关系。如果两节点之间的关系是双方对等的(例如朋友关系、同学关系等),则边为无向边;如果两节点之间的关系是不对等的(例如微博的关注关系、论文的引用关系等),则边为有向边,从一个节点指向另一个节点。
社会网络中的信息传播
信息在社会网络中以个人节点为载体,沿着节点之间的边进行传播。信息传播的方向与边的指向一致。在网络中,从不同节点开始传播的信息,其传播效果可能大不相同。社会网络中的信息传播优化问题所要讨论的就是如何选择起始的传播节点,使得信息能获得最大范围的传播(或达到指定的范围)。
独立级联模型(IndependentCascade Model)
社会网络中的信息传播过程可以用独立级联模型来描述。该模型将整个社会网络看做一个有向图,其中是所有节点的集合,是所有边的集合。每条边有一个传播概率,即信息有概率可以沿着某条边从一个节点传播到另一个节点。在此假设所有边的传播概率都相同。
优化问题
给定一个弱连通的有向网络,包含1377个节点和2279条边。
此次的信息传播优化问题描述如下:
1. 如何选择10个初始节点,使得信息的传播范围最广?
2. 如果希望信息的传播能覆盖800个以上的节点,则最少应该选择哪些用户作为传播的起始节点?
问题一:
#include<iostream>
#include<vector>
#include<map>
#include<stdio.h>
#include<stdlib.h>
#include<queue>
#include<time.h>
#include<algorithm>
//Social Network Pro1
//Author:I-Hsin
using namespace std;
class node
{
public:
vector<int>source;//这个点是由哪些源点扩展出来的,删去源点后则为-1.
bool flgsource;//自身是否为源点
int level;//BFS时处于第几层
int area;//the area that the node cover as a source node
int id;//index
vector<int>spread;//the nodes that this one covers,which differs at other time
int od;//when it has been expanded in a bfs
public:
node(){}
node(int i,int l,int o)
{
flgsource=false;
level=l;
area=0;
id=i;
od=o;
}
};
vector<int>network[1380];//save the graph
node dot[1380];//save the node;
long long Map[1380];//map int to the index of type long long
map<long long,int>mp;//map index of type long long to int
int cnt[1380];//count the times that the node is chossen as the ten greatest source node
bool used[1380];//for dfs to find top nodes
const int N=10000;//times for simulation
const int Side=8;//the level that one node nee