1 #include<bits/stdc++.h> 2 #include<windows.h> 3 4 using namespace std; 5 6 map<string,int>mp; 7 map<string,bool>mp2; 8 map<pair<int,int>,bool>con; 9 vector<int>G[5500]; 10 vector<int>pre[5500]; 11 string s[5500]; 12 int dis[5500],DC[5500],id[5500],CC[5500],EC[5500]; 13 double ECC[5500],Lid[5500],ct[5500],ks[5500],BC[5500]; 14 bool vis[5500]; 15 int ans=0; 16 void outtest(){ 17 ofstream outFile; 18 outFile.open("out.csv", ios::out); 19 for(int i=1;i<=ans;i++){ 20 for(int j=1;j<=ans;j++){ 21 outFile<<G[i][j]<<","; 22 } 23 outFile<<endl; 24 } 25 outFile.close(); 26 } 27 //求最短路,输入x,返回x到其他点的最短路之和 28 int Dijkstra(int x){ 29 memset(vis,false,sizeof(vis)); 30 memset(dis,0x3f3f3f3f,sizeof(dis)); 31 dis[x]=0; 32 int num=1; 33 queue<int>q; 34 vis[x]=true; 35 q.push(x); 36 while(!q.empty()){ 37 int p=q.front(); 38 q.pop(); 39 int d=G[p].size(); 40 for(int i=0;i<d;i++){ 41 if(!vis[G[p][i]]){ 42 dis[G[p][i]]=dis[p]+1; 43 vis[G[p][i]]=true; 44 num++; 45 q.push(G[p][i]); 46 } 47 } 48 if(num==ans) break; 49 } 50 while(!q.empty()){ 51 q.pop(); 52 } 53 int sum=0; 54 for(int i=1;i<=ans;i++){ 55 sum+=dis[i]; 56 } 57 return sum; 58 } 59 void Degree(){ 60 sort(id+1,id+1+ans,[](const int &a, const int &b){if(DC[a]==DC[b]){return s[a]<s[b];} return DC[a]>DC[b];}); 61 int result=0; 62 cout<<"Degree: "; 63 for(int i=1;i<=600;i++){ 64 if(mp2[s[id[i]]]) result++; 65 if(i%100==0) cout<<result<<" "; 66 } 67 cout<<endl; 68 } 69 //将每个点的最短路之和存到CC[i]中,然后排序,输出。 70 void Closeness(){ 71 memset(CC,0,sizeof(CC)); 72 for(int i=1;i<=ans;i++){ 73 CC[i]=Dijkstra(i); 74 } 75 sort(id+1,id+1+ans,[](const int &a, const int &b){if(CC[a]==CC[b]){return s[a]<s[b];} return CC[a]<CC[b];}); 76 int result=0; 77 cout<<"Closeness: "; 78 for(int i=1;i<=600;i++){ 79 if(mp2[s[id[i]]]) result++; 80 if(i%100==0) cout<<result<<" "; 81 } 82 cout<<endl; 83 } 84 void Betweenness(){ 85 for(int x=1;x<=ans;x++){ 86 stack<int>st; 87 memset(vis,false,sizeof(vis)); 88 memset(dis,0x3f3f3f3f,sizeof(dis)); 89 memset(ks,0,sizeof(ks)); 90 memset(ct,0,sizeof(ct)); 91 dis[x]=0; 92 ct[x]=1; 93 int num=1; 94 queue<int>q; 95 vis[x]=true; 96 q.push(x); 97 while(!q.empty()){ 98 int p=q.front(); 99 q.pop(); 100 st.push(p); 101 int d=G[p].size(); 102 for(int i=0;i<d;i++){ 103 if(!vis[G[p][i]]){ 104 dis[G[p][i]]=dis[p]+1; 105 vis[G[p][i]]=true; 106 q.push(G[p][i]); 107 } 108 if(dis[G[p][i]]==dis[p]+1){ 109 ct[G[p][i]]+=ct[p]; 110 pre[G[p][i]].push_back(p); 111 } 112 } 113 } 114 while(!st.empty()){ 115 int p=st.top(); 116 st.pop(); 117 int d=pre[p].size(); 118 for(int i=0;i<d;i++){ 119 ks[pre[p][i]]+=ct[pre[p][i]]/ct[p]*(1.0+ks[p]); 120 } 121 if(p!=x){ 122 BC[x]+=ks[p]; 123 } 124 } 125 for(int j=1;j<=ans;j++){ 126 pre[j].clear(); 127 } 128 } 129 sort(id+1,id+1+ans,[](const int &a, const int &b){if(fabs(BC[a]-BC[b])<1e-8){return s[a]<s[b];} return BC[a]>BC[b];}); 130 int result=0; 131 cout<<"Betweenness: "; 132 for(int i=1;i<=600;i++){ 133 if(mp2[s[id[i]]]) result++; 134 if(i%100==0) cout<<result<<" "; 135 } 136 cout<<endl; 137 } 138 void Clustering_coefficient(){ 139 memset(ECC,0,sizeof(ECC)); 140 int x,y; 141 for(int i=1;i<=ans;i++){ 142 int d=G[i].size(); 143 x=d*(d-1)/2; 144 y=0; 145 for(int j=0;j<d;j++){ 146 for(int k=j+1;k<d;k++){ 147 if(con.find(make_pair(G[i][j],G[i][k]))!=con.end()){ 148 y++; 149 } 150 } 151 } 152 if(d<=1) ECC[i]=0; 153 else ECC[i]=1.0*y/x; 154 } 155 sort(id+1,id+1+ans,[](const int &a, const int &b){if(fabs(ECC[a]-ECC[b])<1e-8){return s[a]<s[b];} return ECC[a]>ECC[b];}); 156 int result=0; 157 cout<<"Clustering_coefficient: "; 158 for(int i=1;i<=600;i++){ 159 if(mp2[s[id[i]]]) result++; 160 if(i%100==0) cout<<result<<" "; 161 } 162 cout<<endl; 163 } 164 void LID(){ 165 memset(Lid,0,sizeof(Lid)); 166 memset(vis,false,sizeof(vis)); 167 int x,y; 168 for(int i=1;i<=ans;i++){ 169 memset(vis,0,sizeof(vis)); 170 int d=G[i].size(); 171 x=0; 172 y=0; 173 for(int j=0;j<d;j++){ 174 for(int k=j+1;k<d;k++){ 175 if(con.find(make_pair(G[i][j],G[i][k]))!=con.end()){ 176 vis[G[i][j]]=1; 177 vis[G[i][k]]=1; 178 y++; 179 } 180 } 181 } 182 for(int j=1;j<=ans;j++){ 183 if(vis[j]&&j!=i){ 184 x++; 185 } 186 } 187 if(y==0) Lid[i]=0; 188 else Lid[i]=1.00*y/x; 189 } 190 sort(id+1,id+1+ans,[](const int &a, const int &b){if(fabs(Lid[a]-Lid[b])<1e-10){return s[a]<s[b];} return Lid[a]>Lid[b];}); 191 int result=0; 192 cout<<"LID: "; 193 for(int i=1;i<=600;i++){ 194 if(mp2[s[id[i]]]) result++; 195 if(i%100==0) cout<<result<<" "; 196 } 197 cout<<endl; 198 } 199 void Eigenvector(){ 200 memset(EC,0,sizeof(EC)); 201 memset(vis,0,sizeof(vis)); 202 for(int i=1;i<=ans;i++){ 203 int d=G[i].size(); 204 for(int j=0;j<d;j++){ 205 EC[i]+=DC[G[i][j]]; 206 } 207 } 208 sort(id+1,id+1+ans,[](const int a, const int b){if(EC[a]==EC[b]) return s[a]<s[b]; return EC[a]>EC[b];}); 209 int result=0; 210 cout<<"Eigenvector: "; 211 for(int i=1;i<=600;i++){ 212 if(mp2[s[id[i]]]) result++; 213 if(i%100==0) cout<<result<<" "; 214 } 215 cout<<endl; 216 } 217 int main(){ 218 ifstream fin("Yeast PPI.txt"); 219 string s1,s2,s3; 220 mp.clear(); 221 mp2.clear(); 222 con.clear(); 223 int x,y; 224 int start_time=GetTickCount(); 225 while(fin>>s1>>s2){ 226 if(mp[s1]==0){ 227 ans++; 228 mp[s1]=ans; 229 s[ans]=s1; 230 DC[ans]=0; 231 id[ans]=ans; 232 } 233 if(mp[s2]==0){ 234 ans++; 235 mp[s2]=ans; 236 s[ans]=s2; 237 DC[ans]=0; 238 id[ans]=ans; 239 } 240 x=mp[s1]; 241 y=mp[s2]; 242 DC[x]++; 243 DC[y]++; 244 G[x].push_back(y); 245 G[y].push_back(x); 246 con[make_pair(x,y)]=true; 247 con[make_pair(y,x)]=true; 248 } 249 fin.close(); 250 ifstream fin2("name.txt"); 251 while(fin2>>s1){ 252 mp2[s1]=true; 253 } 254 // Degree(); 255 // Closeness(); 256 Betweenness(); 257 // Clustering_coefficient(); 258 // LID(); 259 // Eigenvector(); 260 int end_time=GetTickCount(); 261 cout<<"used time: "<<end_time-start_time<<"ms"<<endl; 262 return 0; 263 }
中心性
猜你喜欢
转载自www.cnblogs.com/ls961006/p/9221839.html
今日推荐
周排行