首页 > 代码库 > ZOJ 2316 Matrix Multiplication

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

Andrew Stankevich‘s Contest #1
 
解题:题意转化后,就是计算途中有多少条,长度为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 long14 #define pii pair<int,int>15 #define INF 0x3f3f3f3f16 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\n",ans);35         if(t) puts("");36     }37     return 0;38 }
View Code

 

ZOJ 2316 Matrix Multiplication