题意:给一个无向图,设这个图的关联矩阵为A。然后计算ATA这个矩阵中,所有元素的和。
思路:如果把矩阵求出来,空间是承受不了的,数据量太大了。我们要求的只是ATA的各个元素的和。观察一下关联矩阵,就会发现可以这样求,对于没条边的两个顶点,这条边对结果的贡献是这两个顶点的度,所以只需要扫描每条边,然后加上出现的顶点的度就可以了。
#include <iostream>
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <iomanip>
#include <cstdlib>
#include <string>
#include <memory.h>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <ctype.h>
#define ll long long
#define max3(a,b,c) max(a,max(b,c))
using namespace std;
int edge[100010][2];
int cnt[10010];
int main(){
int n,m;
while(cin>>n>>m){
memset(cnt,0,sizeof(cnt));
for(int i=1;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
edge[i][0]=u;
edge[i][1]=v;
cnt[u]++;
cnt[v]++;
}
ll ans=0;
for(int i=1;i<=m;i++){
ans+=cnt[edge[i][0]];
ans+=cnt[edge[i][1]];
}
cout<<ans<<endl;
}
return 0;
}