图论杂论学习指南

最大独立集问题

当G′中所有点不相邻,最大点集最大的图 G′ 为图 G 的最大独立集,且最大独立集数=补图。

【V是代表的点集,而E代表的是边集】

两个点之间是独立的也就是说这两个点之间就没有边相连

匹配问题

独立集是点的集合,而匹配则是边的集合

在这个集合中,任一两条边之间是不含有公共的端点的
从字面意思来说,最大匹配也就是所包含的最大数量的边的数量,且任意两个边和边之间没有公共点

最大团、最大独立集、匹配的三者关系

  1. 最大独立集 = n - 最大匹配
    1. 最大匹配 = 最小点覆盖
  2. 最大独立集 = n - 最小点覆盖
  3. 最大团 = 补图的最大独立集
  4. 最大独立集 = 补图的最大团
    补图:如果n个点两两之间没有边,那么将这两个点连在一起,如果之前两点之间有边,那么就将这两个点之间的边去掉-》得到补图。

欧拉路径

欧拉路径(Eulerian path)是指沿着图中的边遍历每条边恰好一次的路径。

充分必要条件:且除了起点和终点外,其它顶点的度数必须都是偶数。

无向图的欧拉路径

对于无向图,判断度数为奇数的点的个数,若为0,则设任意一点为起点,若为2,则从这2个点中任取一个作为起点。

  1. 点的个数,若为0,则设任意一点为起点,若为2,则设入度比出度小1的点为起点,另一点为终点。具体起点的选择要视题目要求而定。
  2. 从起点开始进行递归:对于当前节点x,扫描与x相连的所有边,当扫描到一条(x,y)时,删除该边,并递归y。扫描完所有边后,将x加入答案队列。
  3. 倒序输出答案队列。(因为这里是倒序输出,我们可以用栈来存储答案,当然用双端队列也可以)

从起点开始,每一次执行递归函数,相当于模拟一笔画的过程。递归的边界显然就是路径的终点,对于一个有欧拉路径的图,此时图上的所有边都已被删除,自然就不能继续递归。由于存储答案是在遍历以后进行的,答案存储也就是倒序的,因此要倒序输出答案。

//找出的是起点字典序最小的欧拉路径,具体情况应视题意而定。
#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)。树上拓扑序计数

posted @ 2023-11-25 17:59  White_Sheep  阅读(7)  评论(0编辑  收藏  举报