图论杂论学习指南
最大独立集问题
当G′中所有点不相邻,最大点集最大的图 G′ 为图 G 的最大独立集,且最大独立集数=补图。
【V是代表的点集,而E代表的是边集】
两个点之间是独立的也就是说这两个点之间就没有边相连
匹配问题
独立集是点的集合,而匹配则是边的集合
在这个集合中,任一两条边之间是不含有公共的端点的
从字面意思来说,最大匹配也就是所包含的最大数量的边的数量,且任意两个边和边之间没有公共点
最大团、最大独立集、匹配的三者关系
- 最大独立集 = n - 最大匹配
- 最大匹配 = 最小点覆盖
- 最大独立集 = n - 最小点覆盖
- 最大团 = 补图的最大独立集
- 最大独立集 = 补图的最大团
补图:如果n个点两两之间没有边,那么将这两个点连在一起,如果之前两点之间有边,那么就将这两个点之间的边去掉-》得到补图。
欧拉路径
欧拉路径(Eulerian path)是指沿着图中的边遍历每条边恰好一次的路径。
充分必要条件:且除了起点和终点外,其它顶点的度数必须都是偶数。
无向图的欧拉路径
对于无向图,判断度数为奇数的点的个数,若为0,则设任意一点为起点,若为2,则从这2个点中任取一个作为起点。
- 点的个数,若为0,则设任意一点为起点,若为2,则设入度比出度小1的点为起点,另一点为终点。具体起点的选择要视题目要求而定。
- 从起点开始进行递归:对于当前节点x,扫描与x相连的所有边,当扫描到一条(x,y)时,删除该边,并递归y。扫描完所有边后,将x加入答案队列。
- 倒序输出答案队列。(因为这里是倒序输出,我们可以用栈来存储答案,当然用双端队列也可以)
从起点开始,每一次执行递归函数,相当于模拟一笔画的过程。递归的边界显然就是路径的终点,对于一个有欧拉路径的图,此时图上的所有边都已被删除,自然就不能继续递归。由于存储答案是在遍历以后进行的,答案存储也就是倒序的,因此要倒序输出答案。
//找出的是起点字典序最小的欧拉路径,具体情况应视题意而定。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<sstream>
#include<cmath>
#include<list>
#include<stack>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef unsigned long long ull;
const int N=510;
int n,cnt[N],e[N][N];
vector<int> jp;
stack<int> q;
void dfs(int x){
for(int i=1;i<=n;i++){
if(e[x][i]==1){
e[x][i]--,e[i][x]--;
dfs(i);
}
}
q.push(x);
}
int main() {
cin>>n;
int c;
for(int i=1;i<=n;i++){
int a,b;cin>>a>>b;
e[a][b]++,e[b][a]++;
cnt[a]++;
cnt[b]++;
c=min(a,c);
c=min(b,c);
}
for(int i=1;i<=N;i++){
if(cnt[i]%2==1) jp.push_back(i);
}
if(jp.size()!=2&&jp.size()!=0){
cout<<"No"<<endl;
}
int s;
if(jp.size()) s=min(jp[0],jp[1]);
else s=c;
dfs(s);
while(!q.empty()){
int res=q.top();
cout<<res<<" ";
q.pop();
}
return 0;
}
有向图的欧拉路径
如果起点开始有两条边,一条边是应该走的边,另一条是桥。如果我们采用d f s dfsdfs的方式先遍历到底,直到无路可走的时候才加入答案栈中,我们容易知道的是最后无路可走的一定是最后一个点(不可能在之前输出,否则…就不存在这样的路径)每次都采用这样的手段,把无路可走的放在栈后面,有路可走的等到最后无路可走的时候再放上去。
因为常常这样的路径会导致递归栈占用过大,而且答案数组也可能会过大(放在递归里貌似占用递归栈)。
所以采用非递归的写法。
对于欧拉路径的判断呢:
首先考虑欧拉路径(两个奇点,其他都是入度出度相等)
其次考虑欧拉回路(因为可能不连通,所有入度出度都相等并且起点出度>0,可能存在多个欧拉环的情况,要特殊判边)
欧拉回路
欧拉回路可以看作是一种特殊的欧拉路径。如果一个图存在欧拉路径,而且起点和终点是同一个顶点,那么这个路径就是欧拉回路(Eulerian circuit)。树上拓扑序计数