试题 算法训练 关联矩阵

资源限制
时间限制:1.0s   内存限制:512.0MB
 
问题描述
  有一个n个结点m条边的有向图,请输出他的关联矩阵。
 
输入格式
  第一行两个整数n、m,表示图中结点和边的数目。n<=100,m<=1000。
  接下来m行,每行两个整数a、b,表示图中有(a,b)边。
  注意图中可能含有重边,但不会有自环。
 
输出格式
  输出该图的关联矩阵,注意请勿改变边和结点的顺序。
 
样例输入
5 9
1 2
3 1
1 5
2 5
2 3
2 3
3 2
4 3
5 4
 
样例输出
1 -1 1 0 0 0 0 0 0
-1 0 0 1 1 1 -1 0 0
0 1 0 0 -1 -1 1 -1 0
0 0 0 0 0 0 0 1 -1
0 0 -1 -1 0 0 0 0 1
 
首先需要知道什么是关联矩阵,关联矩阵即用一个矩阵来表示各个点和每条边之间的关系
 
1、对于一个无向图G,pxq, p为顶点的个数,q为边数。bij 表示在关联矩阵中点i和边j之间的关系。若点i和边j之间是连着的,则bij = 1. 反之,则bij = 0.
注意,每一行值的总和为该点的度.
 
 
2、对于有向图,若bij = 1,表示边j离开点i。 若bij = -1, 表示边j进入点i。 若bij = 0,表示边j和点i不相关联。
 
了解了关联矩阵的概念之后问题就迎刃而解了.
 
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cstring>
 5 #include <string>
 6 #include <cmath>
 7 #include <algorithm>
 8 #define INF 0x3f3f3f3f
 9 #define zero 1e-7
10 
11 using namespace std;
12 typedef long long ll;
13 const ll mod=1000000007;
14 const ll max_n=1e5+5;
15 int arr[105][1005]={0};
16 int n, m;//结点数,边数 
17 
18 int main() {
19     int a, b;
20     cin>>n>>m;
21     for(int i=1; i<=m; i++) {
22         scanf("%d %d", &a, &b);
23         arr[a][i]=1;
24         arr[b][i]=-1;
25     }
26     for(int i=1; i<=n; i++) {
27         for(int j=1; j<=m; j++) {
28             printf("%2d ", arr[i][j]);//注意格式
29         }
30         printf("
");
31     }
32     return 0;
33 }
34 /*
35 3 10
36 1 2
37 1 3
38 3 2
39 2 3
40 3 2
41 3 1
42 1 3
43 2 3
44 2 1
45 3 1
46 
47  1  1  0  0  0 -1  1  0 -1 -1 
48 -1  0 -1  1 -1  0  0  1  1  0 
49  0 -1  1 -1  1  1 -1 -1  0  1 
50 */

※注意输出格式为%2d.

原文地址:https://www.cnblogs.com/wwqzbl/p/13534555.html