图 --- 二分图

基本概念

图分为有向图和无向图 顶点集合V  边的集合E,连接俩点u和v的e=(u,v)表示,所以图 G=(V,E);

俩个顶点相连表示俩个顶点相邻,相邻顶点的序列称为路径,起点和终点重合的路径叫做圈,任意俩点之间都有路径连接的图称为连通图,顶点连接边的个数称为度。

没有圈的连通图叫做树,没有圈的非连通图叫做森林。

图的表示

图的表示形式一般采取 邻接矩阵或是邻接表的形式来实现,以下笔记所示:

带权值图形:

邻接表存储:重边和自环

图的实现

#include <iostream>
#include <vector>
using namespace std;

const int MAX = 100;
vector<int> G[MAX];

/**
    struct edge{
        int to;
        int cost;
    };
    vector<edge> G[MAX];
*/
int main()
{
    int V,E;
    cin>>V>>E;
    for(int i=0;i<V;i++){
        int s,t;
        cin>>s>>t;
        G[s].push_back(t);
    }
    ...
}

图的简单实例:二分图,一个图中存在着n个顶点,相邻的顶点着上不同颜色,是否可以使用俩种颜色给图上色,是

输出 yes 否则输出No。yes 代表的图称为二分图

#include <iostream>
#include <vector>
using namespace std;

const int MAX = 100;
vector<int> G[MAX];
int V;
int color[MAX];

bool dfs(int v,int c){
    color[v] = c;
    for(unsigned int i=0;i<G[v].size();i++){
        if(color[G[v][i]] == c) return false;
        if(color[G[v][i]]==0 && !dfs(G[v][i],-c)) return false;
    }
    return true;
}
void slove(){
    for(int i=0;i<V;i++){
        if(color[i]==0){
            if(!dfs(i,1)){
                cout<<"No"<<endl;
                return;
            }
        }
    }
    cout<<"Yes"<<endl;
}
int main()
{
    cin>>V;
    for(int i=0;i<V;i++){
        int s,t;
        cin>>s>>t;
        G[s].push_back(t);
        G[t].push_back(s);
    }
    slove();
}

输入 4;

0 1

1 3

3 4

4 0

输出:yes

输入:3

0 1

0 2

1 2

输出:No

例子是基于无向图。

时间: 2024-09-23 11:00:50

图 --- 二分图的相关文章

POJ 2226 缩点建图+二分图最大匹配

这个最小覆盖但不同于 POJ 3041,只有横或者竖方向连通的点能用一块板子覆盖,非连续的,就要用多块 所以用类似并查集方法,分别横向与竖向缩点,有交集的地方就连通,再走一遍最大匹配即可 一开始还有点没想清楚缩点怎么写,其实就是横向和竖向分别缩一下,不要混在一起,否则很麻烦,要注意一下 #include <iostream> #include <cstdio> #include <cstring> using namespace std; char mat[900][9

#图# #二分图匹配# #匈牙利算法#

二分图 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图. 区别二分图,关键是看点集是否能分成两个独立的点集. 二分图匹配(匈牙利算法) 最大匹配:设 是一个无向图.如顶点集V可分割为两个互不相交的子集 ,选择这样的子集中边数最大的子集称为图的最大匹配问题(maximal matching problem). 完全匹配:如果一个匹配中,  且

HDU 2444 The Accomodation of Students(判断是否可图 + 二分图)

题目大意:有一群人他们有一些关系,比如A认识B, B认识C, 但是这并不意味值A和C认识.现在给你所有互相认识的学生,你的任务是把所有的学生分成两个一组, 住在一个双人房里.相互认识的同学可以住在一个双人房里. 输入数据: 有n个学生 m个关系(m对是相互认识的) 接下来m行是,是m个关系. 如果能够匹配成功则输出需要双人房的个数,否则输出'No' 思路:先判断是否是个二分图,可以使用黑白染色的方法来判断.然后再进行最大匹配. #include<stdio.h> #include<str

kuangbin带你飞 匹配问题 二分匹配 + 二分图多重匹配 + 二分图最大权匹配 + 一般图匹配带花树

二分匹配:二分图的一些性质 二分图又称作二部图,是图论中的一种特殊模型. 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图. 1.一个二分图中的最大匹配数等于这个图中的最小点覆盖数 König定理是一个二分图中很重要的定理,它的意思是,一个二分图中的最大匹配数等于这个图中的最小点覆盖数.如果你还不知道什么是最小点覆盖,我也在这里说一下:假如选

poj图论解题报告索引

最短路径: poj1125 - Stockbroker Grapevine(多源最短路径,floyd) poj1502 - MPI Maelstrom(单源最短路径,dijkstra,bellman-ford,spfa) poj1511 - Invitation Cards(单源来回最短路径,spfa邻接表) poj1797 - Heavy Transportation(最大边,最短路变形,dijkstra,spfa,bellman-ford) poj2240 - Arbitrage(汇率问题,

利用filter实时切换big5和gb2312,以及gb2312的简繁体

IEEE Spectrum 杂志发布了一年一度的编程语言排行榜,这也是他们发布的第四届编程语言 Top 榜. 据介绍,IEEE Spectrum 的排序是来自 10 个重要线上数据源的综合,例如 Stack Overflow.Twitter.Reddit.IEEE Xplore.GitHub.CareerBuilder 等,对 48 种语言进行排行. 与其他排行榜不同的是,IEEE Spectrum 可以让读者自己选择参数组合时的权重,得到不同的排序结果.考虑到典型的 Spectrum 读者需求

俑烟汲的诿樟透磺勒秤窗mvus

IEEE Spectrum 杂志发布了一年一度的编程语言排行榜,这也是他们发布的第四届编程语言 Top 榜. 据介绍,IEEE Spectrum 的排序是来自 10 个重要线上数据源的综合,例如 Stack Overflow.Twitter.Reddit.IEEE Xplore.GitHub.CareerBuilder 等,对 48 种语言进行排行. 与其他排行榜不同的是,IEEE Spectrum 可以让读者自己选择参数组合时的权重,得到不同的排序结果.考虑到典型的 Spectrum 读者需求

&quot;《算法导论》之‘图’&quot;:不带权二分图最大匹配(匈牙利算法)

博文“二分图的最大匹配.完美匹配和匈牙利算法”对二分图相关的几个概念讲的特别形象,特别容易理解.本文介绍部分主要摘自此博文. 还有其他可参考博文: 趣写算法系列之--匈牙利算法 用于二分图匹配的匈牙利算法 1. 前言 二分图:简单来说,如果图中点可以被分为两组,并且使得所有边都跨越组的边界,则这就是一个二分图.准确地说:把一个图的顶点划分为两个不相交集 U 和V ,使得每一条边都分别连接U.V中的顶点.如果存在这样的划分,则此图为一个二分图.二分图的一个等价定义是:不含有「含奇数条边的环」的图.

二分图判定【图的搜索】

二分图判定 给定一个图,要给图上每个顶点染色,并且要使得相邻的顶点颜色不同.问是否能最多用2种颜色进行染色? 参考如下: Source Code: #include <iostream> #include <vector> using namespace std; vector<int> Edge[1010]; int colorArr[1010]; void initColorArr(int length){ for(int i=0;i<=length;++i)