Linux友人帐之网络编程基础DNS服务器

2023-11-02 18:04

本文主要是介绍Linux友人帐之网络编程基础DNS服务器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、DNS服务器

1.1概述

DNS(Domain Name System)是一种分布式系统,用于将域名映射到IP地址。它是互联网上的基础设施之一,作为一种网络协议,它将域名转换为对应的IP地址。DNS的主要功能是将易于记忆的域名转换为计算机可识别的IP地址,让用户通过域名访问互联网资源。

DNS使用层次结构的命名系统来命名主机或互联网上的任何资源,例如网站、邮件服务器等。DNS解析器在用户使用网络服务时自动执行,它会将用户输入的域名解析为相应的IP地址,然后通过Internet连接将用户请求发送到相关的服务器上

DNS服务通过将域名和IP地址进行关联,使得用户可以更容易地访问互联网上的资源,而无需记住那些复杂的IP地址。DNS系统的性能和可靠性对于互联网的正常使用具有重要的影响。

1.2DNS名字空间

DNS名字空间是一种树状结构,用于将域名和IP地址映射到一起。在DNS Namespace中,域名分层级别命名,每个级别使用点分隔。例如.com、.org、.edu等。每个域名都可以包含多个子域名,例如example.com和subdomain.example.com。

.com域名通常用于商业用途,.net域名通常用于网络技术相关的网站,而.org域名通常用于非盈利组织和公共组织的网站。同时,它们也可以被用于其他各种目的,这取决于个人或组织的需求和目的。

除此之外,还有其他的TLD,比如.gov(政府)、.edu(教育)、.mil(军事)等。每个TLD都有自己的规则和限制,具体信息可在域名注册商网站上查询

 1.3DNS域名服务器

 DNS域名服务器(Domain Name System)是一种分布式数据库系统,用于将域名解析为与之对应的IP地址。当用户在浏览器中输入一个域名时,DNS服务器会查询域名的IP地址,并将其返回给用户的计算机,使其能够连接到该域名所代表的网络资源。域名服务器通常由ISP或企业自己管理,它们之间相互连接,形成了一个分布式的、层次化的域名解析系统,以确保域名解析的高可靠性和稳定性。

 1.4DNS域名解析

具体来说,当你在浏览器中输入一个域名时,浏览器会向本地DNS服务器请求解析该域名的IP地址。如果本地DNS服务器缓存中有该记录,就直接返回IP地址;如果缓存中没有,本地DNS服务器会向根域名服务器请求该域名使用的顶级域名服务器地址,然后再向顶级域名服务器请求下一级域名服务器地址,直至找到该域名的IP地址,并将其返回给浏览器。这个过程就是DNS域名解析。

 1.5DNS查询命令

nslookup命令

nslookup是一个网络命令,用于在DNS服务器上查询DNS域名解析的信息。 它可以帮助诊断DNS问题,解析IP地址,查询DNS记录等。nslookup在Windows、Linux、Mac OS等操作系统中都有支持。

nslookup的语法格式如下:

nslookup [option] [hostname/IP address] [DNS server]

其中,选项和DNS服务器参数是可选的。若不指定DNS服务器,则默认使用本地计算机的DNS服务器。一些常用的选项包括:

- `-querytype`: 指定要查询的DNS记录类型,如A记录、MX记录、CNAME记录等。
- `-debug`: 输出更详细的调试信息。
- `-timeout`: 设置DNS查询超时时间。

例如,要查询主机www.example.com的IP地址,可以在命令提示符下输入以下命令: 

nslookup www.example.com

如果要查询MX记录,可以使用`-querytype`选项:

nslookup -querytype=MX example.com

nslookup还支持交互式操作模式,用户可以直接在nslookup中输入命令,而不用每次都输入完整的命令。可以通过输入`nslookup`命令进入交互式模式,输入`exit`命令退出。

 dig命令

dig是一个常用的DNS查询工具,可以用于查询域名的DNS解析记录,包括域名的IP地址、MX记录、NS记录等。它可以在Linux/Unix、Windows和macOS等操作系统上使用。

常用的dig命令格式如下:

dig [@server] [-b address] [-c class] [-f filename] [-k filename] [-m] [-p port] [-q name] [-t type] [-x addr] [-y name:key] [-4] [-6] [name] [type] [class] [options]

其中,常用的选项和参数有:

- server:指定要查询的DNS服务器的IP地址或域名。如果不指定,默认使用本地DNS服务器。
- name:要查询的域名,可以是完整的域名或者主机名。
- type:查询的记录类型,比如A、MX、CNAME等。
- class:查询的记录类别,通常为IN(Internet)。
- -x:通过IP地址反向查询域名。
- -t:指定查询的记录类型,也可以直接在命令行中指定。
- -4/-6:指定使用IPv4或IPv6协议。

例如,查询百度的A记录可以使用以下命令:

dig baidu.com A

查询谷歌的MX记录可以使用以下命令:

dig google.com MX

查询本机IP的反向解析域名可以使用以下命令:

dig -x 192.168.1.1

1.6相关概念 

DNS A记录是域名系统(DNS)中的一种记录类型,用于将域名解析为与之相关联的IP地址。A记录通常用于将域名解析为Web服务器的IP地址,以便访问网站。

MX记录是域名系统(DNS)中的一种记录类型,用于指定接收该域名下电子邮件的邮件服务器。MX记录通常用于将域名解析为电子邮件服务器的IP地址,以便正确路由和传递电子邮件。

NS记录是域名系统(DNS)中的一种记录类型,用于指定将该域名解析为IP地址的权威DNS服务器。NS记录通常由域名注册商或DNS服务提供商设置,它们包含一个或多个DNS服务器的主机名和IP地址。

总结:A记录用于将域名解析为Web服务器的IP地址,而MX记录用于将域名解析为接收电子邮件的邮件服务器的IP地址。

CNAME记录是域名系统(DNS)中的一种记录类型,用于创建别名或指向另一个域名的指针。CNAME记录允许将一个域名解析为另一个域名,从而使多个域名指向同一个IP地址或服务器。

举个例子,假设有一个网站 www.example.com,想要创建一个别名 blog.example.com 指向同样的内容。可以在 DNS 设置中添加一个 CNAME 记录,将 blog.example.com 解析为 www.example.com。

需要注意的是,CNAME记录不能与其他记录类型(如A记录、MX记录等)共存于同一个域名下。一个域名只能有一个CNAME记录,如果需要设置其他记录类型,需要删除CNAME记录或使用其他方式进行配置。

 1.7DNS软件包与配置文件

软件包

BIND
 安装

配置文件 

正向区域解析文件

反向区域解析文件

二、实验

2.1Linux本机DNS配置

任务描述

通常我们在局域网中判断一个主机是否可以访问,一般使用ping去访问该主机名即可,最常见的是访问本机,例如: ping localhost,那么计算机是如何将localhost转化为127.0.0.1,本关我们将介绍如何在本机进行配置主机名与 IP地址的映射关系

本关任务:学会如何在局域网中配置主机名与IP的映射关系,这样就可以使用主机名来替换IP地址,方便于我们的记忆。

相关知识

无论在局域网还是Internet上,每台主机都有一个IP地址,是为了区分此台主机和彼台主机,也就是说IP地址就是主机的门牌号。但IP地址不方便记忆,所以又有了域名Domain)。域名只是在公网(internet)中存在,每个域名都对应一个IP地址,但一个IP地址可以对应多个域名。

在一个局域网中,每台机器都有一个主机名(hostname),为了便于主机与主机之间的区分,就可以为每台机器设置主机名,以容易记忆的方法来相互访问。

主机名(hostname)和域名(Domain)的区别:主机名的含义是机器本身的名字,域名是方便记录IP地址才做的一种IP映射;二者有共性:都能对应到一个唯一的IP上,从应用场景上可以这么简单理解二者的区别:主机名用于局域网中;域名用于公网中。

接下来我们来一起学习如何在局域网中配置主机名与IP地址的映射关系

Linux主机名配置文件

大多数Linux系统的主机名的配置文件是/etc/hostshosts - The static table lookup for Linux hostname(主机名查询静态表);由于 Linux发行版本众多,与主机名相关的配置文件有时也有所不同。

/etc/hosts 配置文件是用来把主机名字映射到IP地址的方法,这种方法比较简单。但这种映射只是本地机器的映射,也就是说每台机器都是独立的,所有的计算机都不能相互通过Linux hostname来访问。

我们来看下/etc/hosts文件里存放的内容:

可以看到/etc/hosts文件中的每行分为两部分内容,第一部分表示IP地址,第二部分表示该IP地址对应的主机名,可以看到第一行的内容是127.0.0.1 localhost,现在我们明白了为什么输入localhost也可以访问本机,正是因为在/etc/hosts文件中配置了该项,所以我们在使localhost访问本地也就相当于使用127.0.0.1访问,我们知道IP地址以127开头的都是表示本机。

通过以上配置文件的内容我们还知道,我们也可以使用ubuntu去访问本地,也就是说localhostubuntu都是该主机的名称。

添加一个新的主机名映射

案例演示:我们通过修改/etc/hosts文件,新添加一条映射记录,新的主机名为test,其对应的IP地址为127.0.0.1,具体使用如下步骤:

  1. 追加一行 127.0.0.1 test (sudo vim /etc/hosts)
  2. ping -c 5 test

添加一行新记录:

验证:

可以看到此刻我们也可以通过test来访问127.0.0.1了。其中ping -c 5 test命令表示向test主机发生5个 ICMP 数据包。

删除一个主机名映射

案例演示:我们通过修改/etc/hosts文件,删除一条映射记录,例如将上个实例中新添加的记录删除掉或者注释起来,具体使用如下步骤:

  1. 删除127.0.0.1 test 行(sudo vim /etc/hosts)
  2. ping -c 5 test

注释一行记录:

验证:

可以看到我们是无法访问test主机的,一共发生了5个数据包,这5个数据包都丢失,也就是说对方主机是不可访问的。

编程要求

在右侧命令行中配置本地主机名与IP地址的映射,具体编程要求如下:

  • 新添加一条映射记录127.0.1.1 --> newLocalhost

  • 新添加一条映射记录127.1.1.1 --> www.baidu.com

测试说明

平台将对你编写的代码进行评测:

预期输出:

  1. 映射127.0.1.1——>newLocalhost成功
  2. 映射127.1.1.1——>www.baidu.com成功

 2.2安装DNS服务软件

任务描述

BIND (Berkeley Internet Name Domain)是Domain Name System (DNS) 协议的一个实现,提供了DNS主要功能的开放实现。

本关任务:介绍Linux系统上常用的DNS服务器软件BIND,我们学会如何在Linux系统上搭建一个DNS服务器。

相关知识

BINDDomain Name System(DNS) 协议的一个实现,提供了DNS主要功能的开放实现,包括:

  • 域名服务器 (named);
  • DNS解析库函数;
  • DNS服务器运行调试所用的工具。

BIND是一款开放源码的DNS服务器软件,由美国加州大学Berkeley分校开发和维护的,按照ISC的调查报告,BIND是世界上使用最多最广泛的域名服务系统。

接下来,我们学习如何在Linux系统上安装BIND服务软件。

Linux系统安装软件和Windows系统上安装软件不太一样,在Windows上我们只需要下载需要安装的软件二进制文件(常见的格式是.exe),然后双击即可进行安装。而Linux系统上安装软件的常见方式有如下几种:

  1. 源码编译安装
  2. 软件包安装
  3. 在线安装

源码安装步骤是下载源码到本机,然后对源码进行编译,生成可执行文件,然后将生成的可执行文件拷贝到对应的安装目录即可,常见的软件源码包格式为.tar.gz.tar.bz2等;

软件包安装步骤是下载好已经编译好的可执行文件包,然后使用对应的包管理工具进行安装,不同的Linux系统使用不同的包管理工具,常见包管理工具如下所示:

  1. Ubuntu/Debian 系统使用 dpkg 进行管理软件包(软件包的后缀为.deb);
  2. Redhat/CentOS 系统使用 rpm 进行管理软件包(软件包的后缀为.rpm);

在线安装是指不需要用户亲自下对应软件的包,但是需要对应系统能够访问互联网,不同的Linux系统使用不同的工具进行在线安装软件,常见的在线安装软件的工具如下所示:

  1. Ubuntu/Debian 系统使用 apt-get 进行在线安装软件;
  2. Redhat/CentOS 系统使用 yum 进行在线安装软件;

建议使用在线安装软件,离线安装软件常见的问题是软件间的依赖问题,如果离线安装软件,则必须要手动安装依赖的库,而在线安装则只需要一条命令完成所有的操作,在线安装会自动去安装依赖库;

源码安装BIND

bind软件依赖 openssl-1.0.0e.tar.gz软件包,所以在安装bind软件前,需要先安装openssl软件。

安装openssl依赖包步骤如下所示:

  1. 解压源码包:tar zxvf openssl-1.0.0e.tar.gz
  2. 进入源码文件夹:cd openssl-1.0.0e/
  3. 配置(生成Makefile):./config --prefix=/usr/local/
  4. 依赖分析:make depend
  5. 编译源码:make
  6. 安装源码:sudo make install

[配置成功执行结果(./config --prefix=/usr/local/)]

[配置成功执行结果(./config --prefix=/usr/local/)]

[make depend成功执行结果]

[make成功执行结果]

[sudo make install成功执行结果]

下载bind源码包,此处使用的是 bind-9.9.2.tar.gz 。

具体安装步骤如下所示:

  1. 解压源码包:tar zxvf bind-9.9.2.tar.gz
  2. 进入源码文件夹:cd bind-9.9.2/
  3. 配置(生成Makefile):./configure --sysconfdir=/etc/bind
  4. 编译源码:make
  5. 安装源码:sudo make install

[配置成功执行结果(./configure --sysconfdir=/etc/bind)]

[make成功执行结果]

[sudo make install成功执行结果]

在线安装BIND(重要)

本实验环境使用的系统是Ubuntu,所以使用apt-get工具来在线安装软件,具体步骤如下所示:

  1. 更新软件源:sudo apt-get update
  2. 安装httpd:sudo apt-get install bind9

如果安装成功则会出现如下界面:

注意如果当前用户是root,则执行以上安装命令时不需要加sudo

编程要求

本关任务是学会如何在线安装bind软件。

具体编程要求如下:

  • 在线安装bind软件(实验环境使用的是Ubuntu系统)。
测试说明

本关的测试需要用户在右侧的命令行下完成,用户只需将需要完成的命令在右侧命令行下直接操作即可,然后点击评测按钮,平台会自动验证用户是否按照要求去检测结果。

2.3DNS服务器启动/关闭

任务描述

通过上一关的学习,我们学会如何在Linux系统上安装bind软件,当我们安装好后,我们接下学会如何开启/关闭bind服务。

本关任务:介绍在Linux系统上如何开启、关闭和重启bind服务。

相关知识

当我们安装成功bind软件后,ubuntu12.04系统下默认bind服务是开启的,但是本平台的测试环境默认是关闭的。

本实验环境使用的系统是Ubuntu,当我们使用apt-get在线安装软件后,通常会在/etc/init.d/目录下生成一个启动该服务软件的脚本,例如,我们使用apt-get安装bind软件后,我们可以看到在/etc/init.d/目录下生成一个名为bind9的脚本文件,该脚本可以用来控制bind服务的启动与关闭等信息。

[bind服务脚本文件]

Linux service 命令

Linux系统中使用service命令来控制系统服务,它可以启动、停止、重新启动和关闭系统服务,还可以显示所有系统服务的当前状态。

service命令的使用格式:

service 服务名 控制命令

  • 服务名:自动要控制的服务名,即/etc/init.d目录下的脚本文件名;
  • 控制命令:系统服务脚本支持的控制命令。

常见的控制命令:

  1. start:启动该服务;
  2. stop:关闭该服务;
  3. restart:重新启动该服务;
  4. status:查看该服务状态;

注意并不是所有的服务都支持以上4种控制命令,不同的服务提供不同的控制命令,大多数服务都支持以上4种常用的控制命令。

bind服务管理

当我们成功安装bind后,接下来,我们使用service命令来管理bind服务。

我们将在以下案例演示中分别介绍如何启动、关闭、重新启动bind服务,以及查看bind服务状态。

案例演示1

查看bind服务状态,可以使用如下命令:

sudo service bind9 status

[请在右侧“命令行”里直接体验]

可以看到当前bind服务处于running状态,也就是运行状态。

案例演示2

关闭bind服务并且查看是否关闭成功,可以使用如下命令:

  1. sudo service bind9 stop
  2. sudo service bind9 status

[请在右侧“命令行”里直接体验]

可以看到首先将`bind`服务的进程`ID`(`9841`)关掉,然后查看`bind`的状态可以看到找不到对应的`bind`服务对应的进程,也就是说`bind`没有运行。

案例演示3

重新启动bind服务并且查看是否重新启动成功,可以使用如下命令:

  1. sudo service bind9 restart
  2. sudo service bind9 status

[请在右侧“命令行”里直接体验]

可以看到当前bind服务被重新启动,其实重新启动就是先执行stop然后执行start,上图可以看到在stop的时候显示failed,原因是当前的bind服务是没有启动的。

注意:如果当前用户是root,则执行以上命令时不需要加sudo

编程要求

本关任务是学会如何启动/关闭bind服务器。

具体编程要求如下:

  • 开启bind服务(实验环境使用的是Ubuntu系统)。

2.4DNS服务器配置

任务描述

通过以上关卡的学习,我们学会了安装以及启动bind服务器。接下来我们来学习如何配置bind服务器。

本关任务:学会bind服务器的常见配置。

相关知识

域名Internet上某一台计算机或计算机组的名称,是IP地址的映射。域名解析实际上就是把域名映射回IP地址。

域名解析的过程:当一个浏览者在浏览器地址框中打入某一个域名,或者从其他网站点击了链接来到了这个域名,浏览器向这个用户的上网接入商发出域名请求,接入商的DNS服务器要查询域名数据库,看这个域名的DNS服务器是什么。然后到DNS服务器中抓取DNS记录,也就是获取这个域名指向哪一个IP地址。在获得这个IP信息后,接入商的服务器就去这个IP地址所对应的服务器上抓取网页内容,然后传输给发出请求的浏览器

Linux/etc/resolv.conf文件是DNS客户机配置文件,用于设置DNS服务器的IP地址及DNS域名,还包含了主机的域名搜索顺序。

正解与反解的Zone意义

DNS系统最主要的功能就是互查主机名与IP,由于计算机在网络上只认识IP地址,所以,一般来说,我们称由主机名查找IP的过程为正解,由IP查询得到主机名为反解。

Zone(区域):一个正解或反解的设置就是一个zone,通常一个配置文件就是一个zone

Bind配置文件介绍

bind9 配置文件被保存在/etc/bind/目录下。

[bind9配置文件]

常见配置文件说明

  1. named.conf:Bind主配置文件;
  2. named.conf.options:全局选项;
  3. named.conf.default-zones:配置zone文件;
  4. db.root:根服务器指向文件;
  5. db.local:localhost正向区文件,用于将名字localhost转换为本地回送IP地址 (127.0.0.1);
  6. db.127:localhost反向区文件,用于将本地回送IP地址(127.0.0.1)转换为名字localhost。

案例演示1:

假设有域名: test.ubuntu.com,如何配置其对应的IP为: 10.70.110.40,具体使用如下步骤:

  • 向文件/etc/bind/named.conf.default-zones添加如下内容;
zone "test.ubuntu.com"{
type master;
file "/etc/bind/db.test.ubuntu.com";
};zone "110.70.10.in-addr.arpa"{
type master;
file "/etc/bind/db.10";
};

[修改/etc/bind/named.conf.default-zones文件]

  • 新建文件/etc/bind/db.test.ubuntu.com并添加如下内容(可以拷贝db.local,在其基础上进行修改);
;
; BIND data file for local loopback interface
;
$TTL 604800
@ IN SOA test.ubuntu.com. root.test.ubuntu.com. (
2 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS test.ubuntu.com.
@ IN A 10.70.110.40

[新建/etc/bind/db.test.ubuntu.com文件]

  • 新建文件/etc/bind/db.10并添加如下内容(可以拷贝db.127,在其基础上进行修改);
;
; BIND reverse data file for local loopback interface
;
$TTL 604800
@ IN SOA test.ubuntu.com. root.test.ubuntu.com. (
1 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS test.ubuntu.com.
40 IN PTR test.ubuntu.com.

[新建/etc/bind/db.10文件]

  • 修改DNS服务器搜索顺序,将本地作为DNS搜索的第一搜索目录(sudo vim /etc/resolv.conf);

[修改/etc/resolv.conf配置文件]

  • 重新启动bind服务器,然后使用host命令去查询test.ubuntu.com域名与IP 10.70.110.40是否关联起来。
sudo service bind9 restart
host test.ubuntu.com
host 10.70.110.40

[查询结果]

注意:如果没有host命令则需要进行单独安装host命令(sudo apt-get install host)

可以看到test.ubuntu.com域名与10.70.110.40IP地址已经绑定在一起了。

编程要求

本关任务是学会如何配置bind服务器。

注意:在执行本关任务前,首先执行如下命令来初始化任务环境。

  1. apt-get update
  2. apt-get install host

具体编程要求如下:

  • 先有域名test.com,然后将该域名与10.40.211.244IP地址相绑定在一起。
测试说明

本关的测试需要用户在右侧的命令行下完成,用户只需将需要完成的命令在右侧命令行下直接操作即可,然后点击评测按钮,平台会自动验证用户是否按照要求去检测结果.

这篇关于Linux友人帐之网络编程基础DNS服务器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/332332

相关文章

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名 打包文件 把压缩包从服务器下载到本地 把压缩包上传到服务器(zip

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

poj 3181 网络流,建图。

题意: 农夫约翰为他的牛准备了F种食物和D种饮料。 每头牛都有各自喜欢的食物和饮料,而每种食物和饮料都只能分配给一头牛。 问最多能有多少头牛可以同时得到喜欢的食物和饮料。 解析: 由于要同时得到喜欢的食物和饮料,所以网络流建图的时候要把牛拆点了。 如下建图: s -> 食物 -> 牛1 -> 牛2 -> 饮料 -> t 所以分配一下点: s  =  0, 牛1= 1~

poj 3068 有流量限制的最小费用网络流

题意: m条有向边连接了n个仓库,每条边都有一定费用。 将两种危险品从0运到n-1,除了起点和终点外,危险品不能放在一起,也不能走相同的路径。 求最小的费用是多少。 解析: 抽象出一个源点s一个汇点t,源点与0相连,费用为0,容量为2。 汇点与n - 1相连,费用为0,容量为2。 每条边之间也相连,费用为每条边的费用,容量为1。 建图完毕之后,求一条流量为2的最小费用流就行了