资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
有一个n个结点m条边的有向图,请输出他的关联矩阵。
输入格式
第一行两个整数n、m,表示图中结点和边的数目。n<=100,m<=1000。
接下来m行,每行两个整数a、b,表示图中有(a,b)边。
注意图中可能含有重边,但不会有自环。
接下来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 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 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.