ZOJ 2316 Matrix Multiplication

Matrix Multiplication

Time Limit: 2000ms
Memory Limit: 32768KB
This problem will be judged on ZJU. Original ID: 2316
64-bit integer IO format: %lld      Java class name: Main
 

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 = {aij}, such that aij 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 ATA.


This problem contains multiple test cases!

The first line of a multiple input is an integer N, then a blank line followed by N input blocks. Each input block is in the format indicated in the problem description. There is a blank line between input blocks.

The output format consists of N output blocks. There is a blank line between output blocks.


Input

The first line of the input file contains two integer numbers - N and M (2 <= N <= 10 000, 1 <= M <= 100 000). 2M 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

1

4 4
1 2
1 3
2 3
2 4


Sample Output

18


 

Source

 
解题:题意转化后,就是计算途中有多少条,长度为2的路径。注意是无向图。。。。每个顶点,看它的度是多少。从这些度里面选取2个的组合数。。。。。。
 
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <algorithm>
 6 #include <climits>
 7 #include <vector>
 8 #include <queue>
 9 #include <cstdlib>
10 #include <string>
11 #include <set>
12 #include <stack>
13 #define LL long long
14 #define pii pair<int,int>
15 #define INF 0x3f3f3f3f
16 using namespace std;
17 const int maxn = 10010;
18 int d[maxn];
19 int main() {
20     int t,u,v,n,m,ans;
21     scanf("%d",&t);
22     while(t--){
23         scanf("%d %d",&n,&m);
24         memset(d,0,sizeof(d));
25         for(int i = 0; i < m; i++){
26             scanf("%d %d",&u,&v);
27             ++d[u];
28             ++d[v];
29         }
30         ans = 0;
31         for(int i = 1; i <= n; i++)
32             ans += d[i]*(d[i]-1)/2;
33         ans = (ans + m)<<1;
34         printf("%d
",ans);
35         if(t) puts("");
36     }
37     return 0;
38 }
View Code
原文地址:https://www.cnblogs.com/crackpotisback/p/4000617.html