Matrix Multiplication
Time Limit: 2000/1000MS (Java/Others)
Memory Limit: 128000/64000KB (Java/Others)
Problem Description
Let us consider undirected graph G = {V; E} which has N vertices and M edges. Incidence matrix of this graph is N × M matrix A = {a
i,j}, such that a
i,j is 1 if i-th vertex is one of the ends of j -th edge and 0 in the other case. Your task is to find the sum of all elements of the matrix A
TA.
Input
The first line of the input file contains two integer numbers — N and M (2 ≤ N ≤ 10 000, 1 ≤ M ≤100 000). Then 2*M integer numbers follow, forming M pairs, each pair describes one edge of the graph. All edges are different and there are no loops (i.e. edge ends are distinct).
Output
Output the only number — the sum requested.
Sample Input
4 4 1 2 1 3 2 3 2 4
Sample Output
18
Source
Andrew Stankevich Contest 1
Manager
题意:给一个无向图,设这个图的关联矩阵为A。然后计算ATA这个矩阵中,所有元素的和。
关于关联矩阵,百度百科有详细介绍:http://baike.baidu.com/link?url=H9T8Sm0NTuoKwBiKS7nOBFn5oV10M0_UW0XhXAYA2mDjIhq2PUr84sknOaYpYmZocFXDYdp-Kij-RKIIP9rDN_
思路:观察关联矩阵,对于每条边的两个顶点,这条边对结果的贡献是这两个顶点的度,所以只需要扫描每条边,然后加上出现的顶点的度就可以了。
#include <cstring>
#include <cstdio>
typedef long long LL;
const int mx=100010;
int edge[mx][2];
int cnt[mx];
int main() {
int n,m;
while(~scanf("%d%d",&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]];
}
printf("%lld\n",ans);
}
return 0;
}