中心性

  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
今日推荐