資源簡介
可以直接運行的代碼,有詳細文字說明,復雜網絡中社團劃分經典GN算法的實現

代碼片段和文件信息
#include?“MyGN.h“
#include?“stdio.h“
int?main(){
int?ij;
vector?vec_relationship;//記錄有鏈接的邊。
int?max=0;//這個是max是點的個數
//從文件input.txt讀數據
FILE?*f_input?=?fopen(“input.txt“?“r“);
char?*s?=?(char*)malloc(20);
char?*c;
if?(f_input?!=?NULL)
{
fgets(s?100?f_input);
int?i?=?0;
for?(i?=?0;?s[i]?!=?‘-‘;?i++)
{
max?=?10?*?max?+?s[i]?-?48;
}
while?(feof(f_input)?==?0)
{
fgets(s?100?f_input);
int?m?=?0;
int?n?=?0;
for?(i?=?0;?s[i]?!=?‘:‘;?i++)
{
m?=?10?*?m?+?s[i]?-?48;
}
for?(i?=?i?+?1;?s[i]?!=?‘-‘;?i++)
{
n?=?10?*?n?+?s[i]?-?48;
}
V_side?v_sd(m-1?n-1?1);
vec_relationship.push_back(v_sd);
}
}
fclose(f_input);
int?*r_sign?=?new?int[max];//記錄矩陣中行號為i的元素(邊)在vec_relationship?中出現的首索引
//r_sign數組先統一賦值為-1
for(i?=?0;?i? {
r_sign[i]?=?-1;
}
GN_use::v_order(&vec_relationship?r_sign?max);//對vec_relationship中的內容進行排序整理
/*下面是GN算法的實現*/
//當Q值最大時,Q_i存放數組result_temp[][]中對應的行號i,以便在輸出結果的時候容易找到。
int?Q_i=0;
//result_temp_i是在存儲各種Q值下分裂得到各個點的社團隸屬情況要用到的行號下標變量,也就是數組result_temp[][]的行號下標,最后一次的分裂情況下的行號記錄在result_temp_i中。
int?result_temp_i=0;
//vec_result_temp數組每行下標0到max-1的是存放每個點隸屬的集團號,存放每種Q?值下的分裂情況,每行對應一種情況,元素vec_result_temp.Q存放對應的Q值,
vector?vec_result_temp;?
//vec_V_remove_belong數組用來存放每次去除介數最大的邊的隸屬情況,比如v(ij)是在分裂為兩個集團時去除的,則vec_V_remove_belong.x=i-1vec_V_remove_belong.x=j-1,若是
//分裂為三個集團時去除的,則vec_V_remove_belong.belong_clique值為3
vector?vec_V_remove_belong;
//若原始網絡本身就是由幾個孤立的社團構成的,original_community_alones+2是記錄原始網絡的孤立社團數目,
//在vec_result_temp數組中,0到original_community_alones-1的行號記錄的是原始網絡中的社團檢測情況。從行號為original_community_alones記錄的是由于去除最大介數邊的分裂情況。
int?original_community_alones=0;
MyGN?GN_DEAL(0);
GN_DEAL.GN_deal(&vec_relationshipr_signmax&vec_result_temp?&vec_V_remove_belong);//GN算法的入口函數
original_community_alones=GN_DEAL.get_original_community_alones();
Q_i=GN_DEAL.get_Q_i();
result_temp_i=GN_DEAL.get_result_temp_i();
//如果原始網絡時由幾個孤立社團構成,要輸出
//若原始網絡本來是由幾個孤立的社團組成的,要弄清楚,所求的社團數目是original_community_alones+1,因為original_community_alones的下標是從1開始的
int?k3out_temp=0;
if(original_community_alones!=0){
printf(“原始網絡是由%d個孤立的社團構成的:\n“original_community_alones+1);
for(j=0;?j {
printf(“\n集團%d:“(j+1));
for(k3=0;?k3 {
out_temp?=?vec_result_temp.at(original_community_alones-1).point_belong_to[k3];
if(out_temp==j)
{
printf(“%d??“k3+1);
}
}
}
}
else
{
for(int?r_t?=?0;?r_t? for(int?c_t?=?r_t+1;?c_t? GN_use::find_vec_index(r_t?c_t?r_sign?&vec_relationship);//int?position?=?GN_use.position_find(r_tc_t);
}
printf(“\n原始網絡為:“);
for(i=0;?i printf(“%d??“i+1);
}
printf(“\n\n“);
}
//最后把分裂的最佳情況輸出,注意Q_i
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件?????214016??2014-03-16?14:54??GN_c\Debug\GN.bsc
?????文件?????249904??2014-03-16?14:54??GN_c\Debug\GN.exe
?????文件?????274208??2014-03-16?14:54??GN_c\Debug\GN.ilk
?????文件????1447744??2014-03-16?14:54??GN_c\Debug\GN.pch
?????文件?????476160??2014-03-16?14:54??GN_c\Debug\GN.pdb
?????文件?????139399??2014-03-16?14:54??GN_c\Debug\Test.obj
?????文件??????????0??2014-03-16?14:54??GN_c\Debug\Test.sbr
?????文件??????66560??2014-03-16?14:54??GN_c\Debug\vc60.idb
?????文件??????94208??2014-03-16?14:54??GN_c\Debug\vc60.pdb
?????文件????????508??2013-04-20?10:11??GN_c\Dian.h
?????文件???????4673??2013-04-20?22:49??GN_c\GN.dsp
?????文件????????510??2013-04-19?16:16??GN_c\GN.dsw
?????文件??????74752??2014-03-16?14:59??GN_c\GN.ncb
?????文件??????53760??2014-03-16?14:59??GN_c\GN.opt
?????文件???????1007??2014-03-16?14:54??GN_c\GN.plg
?????文件??????16918??2013-04-21?10:24??GN_c\GN_use.h
?????文件????????552??2010-05-16?20:33??GN_c\input.txt
?????文件??????11542??2013-04-21?12:39??GN_c\MyGN.h
?????文件????????324??2013-04-20?10:02??GN_c\Point_belong.h
?????文件???????1054??2013-04-20?10:13??GN_c\Queue.h
?????文件????????366??2013-04-20?10:03??GN_c\S_remove_belong.h
?????文件???????7296??2014-03-12?17:05??GN_c\Test.cpp
?????文件????????608??2013-04-20?10:03??GN_c\V_side.h
?????目錄??????????0??2014-03-16?14:54??GN_c\Debug
?????目錄??????????0??2014-03-16?14:59??GN_c
-----------?---------??----------?-----??----
??????????????3136069????????????????????25
評論
共有 條評論