#include <iostream>
#include <iomanip>
#include <time.h>
using namespace std;
int jd_sum;//节点总数
int jd_xx[6*100000];//所有连接情况
int jd_mark[100003];//当前所有节点的状况,平常态为0,感染态为-1,免疫态为1
//10000为平常态,10001为感染态,10002为免疫态
int jd_ID_xx[100000];//当前选中节点的状况
int jd_ID_num;//与之相连节点数目
double bd_gr,bd_hf,bd_my;//感染概率,恢复概率,免疫概率
int jd_ID;//要查询的节点ID
void start_static();//初始化
void new_jdxx(int *xx,int xy);//构造节点与节点之间关系
int now_jd(int *xx,int xy,int xz,int *xa);//求与之相连的节点数
int judge_jd(int *xx,int xy,int *xa,int xb,int xc,int xd);//病毒传播模拟
int main()
{
int i,temp,m=0;
int n[100]={0};
DONG00:
cout<<"请输入总节点的个数(4-100000):";
DONG10:
cin>>jd_sum;
if(jd_sum>100000||jd_sum<4)
{
cout<<"对不起,您的输入不规范。请重新输入:";
goto DONG10;
}
new_jdxx(jd_xx,jd_sum);
for(int jd_ID=0;jd_ID<jd_sum;jd_ID++)
{
m=now_jd(jd_xx,jd_sum,jd_ID,jd_ID_xx);
if(m==3)
n[1]++;
else if(m==4)
n[2]++;
else if(m==5)
n[3]++;
else if(m==6)
n[4]++;
else if(m==7)
n[5]++;
else if(m==8)
n[6]++;
else if(m==9)
n[7]++;
else if(m==10)
n[8]++;
else if(m>10&&m<=20)
n[9]++;
else if(m>20&&m<=50)
n[10]++;
else if(m>50&&m<=100)
n[11]++;
else if(m>100&&m<=200)
n[12]++;
else if(m>200&&m<=1000)
n[13]++;
else
n[14]++;
}
cout<<"度为3的节点个数:"<<n[1]<<endl;
cout<<"度为4的节点个数:"<<n[2]<<endl;
cout<<"度为5的节点个数:"<<n[3]<<endl;
cout<<"度为6的节点个数:"<<n[4]<<endl;
cout<<"度为7的节点个数:"<<n[5]<<endl;
cout<<"度为8的节点个数:"<<n[6]<<endl;
cout<<"度为9的节点个数:"<<n[7]<<endl;
cout<<"度为10的节点个数:"<<n[8]<<endl;
cout<<"度为10~20的节点个数:"<<n[9]<<endl;
cout<<"度为20~50的节点个数:"<<n[10]<<endl;
cout<<"度为50~100的节点个数:"<<n[11]<<endl;
cout<<"度为100~200的节点个数:"<<n[12]<<endl;
cout<<"度为200~1000的节点个数:"<<n[13]<<endl;
cout<<"度大于1000的节点个数:"<<n[14]<<endl;
DONG11:
cout<<"请输入节点正常态被感染的概率(0-1):";
cin>>bd_gr;
if(bd_gr>1||bd_gr<0)
{
cout<<"对不起,您的输入不规范。请重新输入:";
goto DONG11;
}
cout<<"请输入节点从感染态恢复的概率(0-1):";
DONG12:
cin>>bd_hf;
if(bd_hf>1||bd_hf<0)
{
cout<<"对不起,您的输入不规范。请重新输入:";
goto DONG12;
}
cout<<"请输入节点转变为免疫态的概率(0-1):";
DONG13:
cin>>bd_my;
if(bd_my>1||bd_my<0)
{
cout<<"对不起,您的输入不规范。请重新输入:";
goto DONG13;
}
cout<<"输入要查询节点的ID(0-"<<jd_sum-1<<"),跳出请输入-1:";
DONG14:
while(cin>>jd_ID)
{
if(jd_ID==-1)
{
break;
}
else if(jd_ID<-1||jd_ID>=jd_sum)
{
cout<<"对不起,您的输入不规范。请重新输入:";
goto DONG14;
}
jd_ID_num=now_jd(jd_xx,jd_sum,jd_ID,jd_ID_xx);
cout<<jd_ID_num<<":"<<endl;
for(i=0;i<jd_ID_num;i++)
{
cout<<setw(6)<<jd_ID_xx[i];
if(i%10==9)
{
cout<<endl;
}
}
cout<<endl;
cout<<"输入要查询节点的ID(0-"<<jd_sum-1<<"),跳出请输入-1:";
}
DONG01:
start_static();
temp=rand()%jd_sum;
jd_mark[temp]=-1;//初始化时,随机选一个节点,使其为感染态
temp=judge_jd(jd_xx,jd_sum,jd_mark,(int)(bd_gr*1000),(int)(bd_hf*1000),(int)(bd_my*1000));//bd_gr,bd_hf,bd_my
cout<<"此次共运行了"<<temp<<"个回合。"<<endl;
cout<<"网络中从未被感染的点的个数为"<<jd_mark[10000]<<"个,";
cout<<"曾被感染的点的个数为"<<jd_mark[10001]+jd_mark[10002]<<"个,";
cout<<"获得免疫的点的个数为"<<jd_mark[10002]<<"个。"<<endl;
cout<<"-----------------------------------------------------------"<<endl;
cout<<"请问你要做:新的测试(1),重复测试(2),退出测试(0)。";
DONG02:
cin>>i;
if(i==0||i==1||i==2)
{
if(i==1)
{
goto DONG11;
}
else if(i==2)
{
goto DONG01;
}
}
else
{
cout<<"对不起,您的输入不规范。请重新输入:";
goto DONG02;
}
return 0;
}
void start_static()
{
int i;
for(i=0;i<100000;i++)
{
jd_mark[i]=0;//初始全为正常态
}
}
void new_jdxx(int *xx,int xy)
{
srand((int)time(0));
int i,temp;
int rand_1,rand_2,rand_3;
{//初始4个节点
xx[6*0+0]=-1;
xx[6*0+1]=-1;
xx[6*0+2]=-1;
xx[6*0+3]=1;
xx[6*0+4]=2;
xx[6*0+5]=3;
xx[6*1+0]=-1;
xx[6*1+1]=-1;
xx[6*1+2]=-1;
xx[6*1+3]=0;
xx[6*1+4]=2;
xx[6*1+5]=3;
xx[6*2+0]=-1;
xx[6*2+1]=-1;
xx[6*2+2]=-1;
xx[6*2+3]=0;
xx[6*2+4]=1;
xx[6*2+5]=3;
xx[6*3+0]=-1;
xx[6*3+1]=-1;
xx[6*3+2]=-1;
xx[6*3+3]=0;
xx[6*3+4]=1;
xx[6*3+5]=2;
}
for(i=4;i<xy;i++)
{//其它点连接
temp=-1;
while(temp==-1)
{
temp=xx[rand()%(6*i)];
}
rand_1=temp;
while(temp==-1||temp==rand_1)
{
temp=xx[rand()%(6*i)];
}
rand_2=temp;
while(temp==-1||temp==rand_1||temp==rand_2)
{
temp=xx[rand()%(6*i)];
}
rand_3=temp;
xx[6*i+0]=i;
xx[6*i+1]=i;
xx[6*i+2]=i;
xx[6*i+3]=rand_1;
xx[6*i+4]=rand_2;
xx[6*i+5]=rand_3;
}
}
int now_jd(int *xx,int xy,int xz,int *xa)
{
int i,num;
num=0;
if(xz>3)
{
xa[num]=xx[6*xz+3];
num++;
xa[num]=xx[6*xz+4];
num++;
xa[num]=xx[6*xz+5];
num++;
}
for(i=0;i<xy;i++)
{
if(xx[6*i+3]==xz)
{
xa[num]=i;
num++;
}
if(xx[6*i+4]==xz)
{
xa[num]=i;
num++;
}
if(xx[6*i+5]==xz)
{
xa[num]=i;
num++;
}
}
return num;
}
int judge_jd(int *xx,int xy,int *xa,int xb,int xc,int xd)
{
int i,num;
int jd_old[100000],jd_new[100000];
bool bl_mark;
int temp_1,temp_2,temp_3;
int rand_1,rand_2,rand_3;
num=0;
for(i=0;i<xy;i++)
{
jd_old[i]=xa[i];
}
bl_mark=true;
while(bl_mark&&num<100000)
{
for(i=0;i<xy;i++)
{//初始化
jd_new[i]=0;
}
for(i=0;i<xy;i++)
{//感染
temp_1=i;
temp_2=xx[6*i+3];
if(xa[temp_1]==-1)
{
temp_3=rand()%(1000);
if(temp_3<xb&&xa[temp_2]!=1)
{
jd_new[temp_2]=-1;
}
}
if(xa[temp_2]==-1)
{
temp_3=rand()%(1000);
if(temp_3<xb&&xa[temp_1]!=1)
{
jd_new[temp_1]=-1;
}
}
temp_1=i;
temp_2=xx[6*i+4];
if(xa[temp_1]==-1)
{
temp_3=rand()%(1000);
if(temp_3<xb&&xa[temp_2]!=1)
{
jd_new[temp_2]=-1;
}
}
if(xa[temp_2]==-1)
{
temp_3=rand()%(1000);
if(temp_3<xb&&xa[temp_1]!=1)
{
jd_new[temp_1]=-1;
}
}
temp_1=i;
temp_2=xx[6*i+5];
if(xa[temp_1]==-1)
{
temp_3=rand()%(1000);
if(temp_3<xb&&xa[temp_2]!=1)
{
jd_new[temp_2]=-1;
}
}
if(xa[temp_2]==-1)
{
temp_3=rand()%(1000);
if(temp_3<xb&&xa[temp_1]!=1)
{
jd_new[temp_1]=-1;
}
}
}
for(i=0;i<xy;i++)
{//恢复
if(xa[i]==-1)
{
temp_3=rand()%(1000);
if(temp_3<xc)
{
temp_3=rand()%(1000);
if(temp_3<xd)
{
jd_new[i]=1;
}
}
}
}
bl_mark=false;
for(i=0;i<xy;i++)
{//赋值
if(jd_new[i]==-1)
{
bl_mark=true;
}
if(xa[i]==0)
{
if(jd_new[i]==-1)
{
xa[i]=-1;
}
else if(jd_new[i]==1)
{
xa[i]=1;
}
}
else if(xa[i]==-1)
{
if(jd_new[i]==0)
{
xa[i]=0;
}
else if(jd_new[i]==1)
{
xa[i]=1;
}
}
if(jd_old[i]==0)
{
if(jd_new[i]==-1)
{
jd_old[i]=-1;
}
else if(jd_new[i]==1)
{
jd_old[i]=1;
}
}
else if(jd_old[i]==-1)
{
if(jd_new[i]==1)
{
jd_old[i]=1;
}
}
}
num++;
}
rand_1=0;
rand_2=0;
rand_3=0;
for(i=0;i<xy;i++)
{
if(jd_old[i]==0)
{
rand_1++;
}
else if(jd_old[i]==-1)
{
rand_2++;
}
else if(jd_old[i]==1)
{
rand_3++;
}
}
xa[10000]=rand_1;
xa[10001]=rand_2;
xa[10002]=rand_3;
return num;
}
- 1
- 2
前往页