马上就开始去老校区进行数模培训了,听韩老师说,美赛很多题都是图论和网络流,于是打算近期恶补图论的相关知识了.
题目是说,对于一个有向图,请用邻接矩阵存储并且输出各个顶点的出度和入度.
解题思路:
这题写出来就是为了好好学习下邻接矩阵的写法,毕竟邻接矩阵也是后续学习图论内容非常重要的一个知识环节.
什么是了邻接矩阵呢?邻接矩阵说的就是对于一个图,把他的所有顶点都抽象出来成为V,把顶点与顶点间的关系抽象出来成为E,
那么不同顶点间肯定会存在边的关系,于是这样,我们就能把这样的一个图通过二维矩阵来描述出来了,如果Edge[i][j]=1,表示这两个顶点之间有边相互连接,
如果表示为0,表示这两个顶点之间没有边相互连接,好了,介绍完邻接矩阵后,再来看看顶点的出入度怎么求解了,我们知道,一个顶点的出入度可以分别从邻接矩阵中读出来了,究竟这个该怎么读呢?我们这样想,把第i个顶点的这一行的值加起来,就对这应了该顶点的出度,把第i个顶点的这一列的值加起来就对应了这个顶点的入度,那么这样一看的话,我们就能够很容易的计算出一个顶点的入度和出度了..
代码:
# include<cstdio>
# include<iostream>
# include<cstring>
using namespace std;
# define MAX 100
int Edge[MAX][MAX];
int main(void)
{
int n,m;//顶点和边数
while ( cin>>n>>m )
{
int u,v;//边的起点和终点
int od,id;//顶点的入度和出度
if ( n == 0 && m == 0 )
{
break;
}
memset( Edge,0,sizeof(Edge) );
for ( int i = 1;i <= m;i++ )
{
cin>>u>>v;
Edge[u-1][v-1] = 1;
}
for ( int i = 0;i < n;i++ )
{
od = 0;
for ( int j = 0;j < m;j++ )
{
od += Edge[i][j];
}
if ( i==0 )
cout<<od;
else
cout<<" "<<od;
}
cout<<endl;
for ( int i = 0;i < n;i++ )
{
id = 0;
for ( int j = 0;j < n;j++ )
{
id += Edge[j][i];
}
if ( i == 0 )
cout<<id;
else
cout<<" "<<id;
}
cout<<endl;
}
return 0;
}