跳到主要内容

图的存储方式

邻接矩阵

无向图的度

给出N个点,M条边的无向图,不存在重边,给一个节点x,求出该节点的度。 1 < N,M < 1000.

输入格式

第1 行,2 个整数N,M。
接下来M行,每行2个整数Ui,Vi,表示边(Ui,Vi)。
接下来一行一个整数x

输出格式

一个整数。

输入/输出例子1

输入:

4 3
1 2
2 4
4 3
3

输出: 1

#include<bits/stdc++.h>
using namespace std;
const int N = 1e3 + 10;

int a[N][N], n, m, x,res;

int main()
{
cin >> n >> m;//输入n个节点和m条边
for (int i = 1; i <= m; i++) {//建立图
int x, y;
cin >> x >> y;
a[x][y]=1; //x到y存在一条边
a[y][x]=1; //y到x存在一条边
}
cin >> x; //输入节点x
for (int i = 1; i <= n; i++) {
if (a[i][x]) {
res++; //结果加1;
}
}
cout << res << endl;

return 0;
}

有向图的出度

给出N个点,M条边的有向图,不存在重边,给一个节点x,求出该节点的出度。

输入格式

第1 行,2 个整数N,M。
接下来M行,每行2个整数Ui,Vi,Wi,表示边(Ui,Vi)的权重为Wi。
接下来一行一个整数x

输出格式

一个整数。

输入/输出例子1

输入:
4 3
1 2 1
2 4 2
4 3 3
3

输出: 0

[1][2][3]填空
#include<iostream>

using namespace std;

const int N = 1e3 + 10;
int a[N][N], n, m, x,res;

int main()
{
cin >> n >> m;//输入n个节点和m条边
for (int i = 1; i <= [1]; i++) {//建立图
int x, y,z;
cin >> x >> y>>z;
[2] ; //x到y存在一条边
}
cin >> x; //输入节点x
for (int i = 1; i <= n; i++) {
if ([3]) {
res++; //结果加1;
}
}
cout << res << endl;
return 0;
}

邻接表

无向图的度

给出N个点,M条边的无向图,可能存在重边但不存在自环,给一个节点x,求出该节点的度。

输入格式

第1 行,2 个整数N,M。
接下来M行,每行2个整数Ui,Vi,表示边(Ui,Vi)。
接下来一行一个整数x(1 < N,M < 1000000)

输出格式

一个整数。

输入/输出例子1

输入:
4 3
1 2
2 4
4 3
3
输出:

1

#include<bits/stdc++.h>
using namespace std;
int N,M;
struct Node {
int v,next;
Node(){ //构造函数1
next=0;
}
Node( int a, int b){ //节点赋值的常见方法
v=a; next=b;
}
};
Node adj[2000002]; //!!!
int idx=1;
int head[1000002];

void insert( int u,int v){
adj[idx] = Node(v, head[u]);//插入一条边
head[u]=idx;
idx++;
}
int main(){
cin >> N >> M;
for (int i=0; i<M; i++) {
int u,v;
cin >> u >> v ;
insert(u,v);
insert(v,u);
}
int x,ans=0;
cin >> x;
for (int i=head[x]; i!=0; i=adj[i].next)
ans++;
cout << ans;
return 0;
}

扩展练习:

  1. [蓝桥杯 2013 国 AC] 网络寻路
  2. [蓝桥杯 2013 国 C] 危险系数
  3. 【深基18.例3】查找文献
  4. 封锁阳光大学
  5. 高手去散步
  6. [蓝桥杯 2018 国 B] 调手表

*学习笔记

暂没有学习笔记,快来抢first blood !