、简介

        class pair ,中文译为对组,可以将两个值视为一个单元。对于map和multimap,就是用pairs来管理value/key的成对元素。任何函数需要回传两个值,也需要pair。

        该函数的相关内容如下所示:

        |->Type----->struct

        |->Include---> <utility>

        |->Define----> pair<calss first,calss second>(first,second)

        |

        |->member

        |      |------>first

        |      |------>second

        |

        |->Sub

        |      |------>constructor(default,assignment,copy)

        |

        |->Fun

        |------>operator(==,<,<=,>,>=,!=,=)

        |------>make_pair(first,second) 返回一个新的pair

     需求:

      Header: <utility>

      Namespace: std

、 stl源码

pair的源码

 // TEMPLATE STRUCT pair

template<class _Ty1,

    class _Ty2> struct pair

    {// store a pair of values

    typedef pair<_Ty1, _Ty2> _Myt;

    typedef _Ty1 first_type;

    typedef _Ty2 second_type;

    pair()

        : first(_Ty1()), second(_Ty2())

        {// construct from defaults

        }

    pair(const _Ty1& _Val1, const _Ty2& _Val2)

        : first(_Val1), second(_Val2)

        {// construct from specified values

        }

    template<class _Other1,

        class _Other2>

        pair(const pair<_Other1, _Other2>& _Right)

        : first(_Right.first), second(_Right.second)

        {// construct from compatible pair

        }

    void swap(_Myt& _Right)

        {// exchange contents with _Right

        if (this != &_Right)

            {// different, worth swapping

            std::swap(first, _Right.first);

            std::swap(second, _Right.second);

            }

        }

    _Ty1 first;// the first stored value

    _Ty2 second;// the second stored value

    };

makepair 的源码

template<class _Ty1,

    class _Ty2> inline

    pair<_Ty1, _Ty2> make_pair(_Ty1 _Val1, _Ty2 _Val2)

    {// return pair composed from arguments

    return (pair<_Ty1, _Ty2>(_Val1, _Val2));

    }

、使用范例

#include <utility> 

#include <stdio.h>

using namespace std;

int main() 

{ 

    pair<char, int> c1(L'x', ); 

    printf("[%c, %d", c1.first, c1.second); 

    c1 = make_pair(L'y', ); 

    printf("[{%c}, {%d}]", c1.first, c1.second); 

    return (); 

} 

来源:http://hi.baidu.com/taozpwater/item/d85d81bde4fd154b2bebe34e

//UVa11624

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <queue>
#include <utility> //使用pair
using namespace std; int r,c;
int map[][];
int dir[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};
queue< pair<int,int> > J; //声明方式
queue< pair<int,int> > F; void bfs()
{
pair<int,int> JJ,FF;
int x, y, i, time = , ok = ; while( !J.empty() )//火-1 墙1 能走0
{
time++; JJ = J.front();
J.pop(); //别忘记pop
map[JJ.first][JJ.second] = ;//标记访问(把这个地方变成墙就行)
for( i = ; i < ; i++)//向四个方向扩展(能走的)
{
x = JJ.first + dir[i][0];
y = JJ.second + dir[i][1]; //pair 具有 first 与 second 成员
if( map[x][y] == - || map[x][y] == )//墙||火不能走
continue;
if( x == r || x == || y == || y == c )//边界则走完
{
ok = ;
printf("%d\n", time);
return;
}
if( map[x][y] == )//能走的
{
J.push(make_pair(x, y));//queue中插入pair 利用make_pair()方法
}
} FF = F.front();
F.pop();
for( i = ; i < ; i++)//向四个方向扩展(会着火的) //两种扩展有顺序,先走后火
{
x = FF.first + dir[i][];
y = FF.second + dir[i][];
if( map[x][y] == - || map[x][y] == )
continue;
if( map[x][y] == || map[x][y] == )
{
map[x][y] = -;
F.push(make_pair(x, y));
}
}
}
if(ok == ) printf("IMPOSSIBLE\n");
} void bfs_fire()
{
    pair<int, int> FF;
    int time, i, x, y;     while( !F.empty() )
    {            
        FF = F.front();
        F.pop();        
        time = map[FF.first][FF.second];         for( i = 0; i < 4; i++)
        {
            x = FF.first + dir[i][0];
            y = FF.second + dir[i][1];
            if(x >= r || x < 0 || y >= c || y < 0)//越界
                continue;            
            if( map[x][y] == 0 )
            {
                map[x][y] = time + 1;
                F.push(make_pair(x, y));
            }
        }
    }
} int main()
{
int N;
int i,j;
char temp; //freopen("1.txt", "r", stdin);
scanf("%d", &N);
getchar();
while(N--)
{
while( !J.empty() ) J.pop(); //注意初始化(清空)队列
while( !F.empty() ) F.pop(); scanf("%d%d", &r, &c);
getchar(); for(i = ; i < r; i++)
{
for(j = ; j < c; j++)
{//# = -1 F = 1 J = 2 . = 0
scanf("%c", &temp);//当读取%c时,注意用getchar吸收掉不必要的回车
if(temp == '#')
map[i][j] = -;
else if(temp == 'F')
{
map[i][j] = ;
F.push(make_pair(i,j));
}
else if(temp == 'J')
{
map[i][j] = ;
J.push(make_pair(i,j));
}
else
map[i][j] = ;
}
getchar();
}
bfs();
}
return ;
}

pair queue____多源图广搜的更多相关文章

  1. 广搜,深搜,单源最短路径,POJ(1130),ZOJ(1085)

    题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=85 http://poj.org/problem?id=1130 这 ...

  2. 图的基本操作(基于邻接矩阵):图的构造,深搜(DFS),广搜(BFS)

    #include <iostream> #include <stdio.h> #include <cstdlib> #include <cstring> ...

  3. 图的基本操作(基于邻接表):图的构造,深搜(DFS),广搜(BFS)

    #include <iostream> #include <string> #include <queue> using namespace std; //表结点 ...

  4. 算法学习笔记(六) 二叉树和图遍历—深搜 DFS 与广搜 BFS

    图的深搜与广搜 复习下二叉树.图的深搜与广搜. 从图的遍历说起.图的遍历方法有两种:深度优先遍历(Depth First Search), 广度优先遍历(Breadth First Search),其 ...

  5. PIGS POJ - 1149网络流(最短增广路---广搜) + 建图

    题意: 第一行输入m和n,m是猪圈的数量,n是顾客的数量,下面n行 第 i+1行表示第i个顾客 , 输入第一个数字表示有几把猪圈的钥匙,后面输入对应的猪圈,最后一个数字输入顾客想买几头猪. 建图: 设 ...

  6. ZOJ2018/4月月赛G题Traffic Light(广搜)

    题意:首先T组数据,每组数据包括:第一行:一个n,m,然后下面有一个n行m列的01矩阵. 最后一行输入四个数字,分别是起点的横纵坐标,终点的横纵坐标.询问从起点到终点,最少要几步,如果到不了输出-1 ...

  7. E. New Reform_贪心,深搜,广搜。

    E. New Reform time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  8. DFS-BFS(深搜广搜)原理及C++代码实现

    深搜和广搜是图很多算法的基础,很多图的算法都是从这两个算法中启发而来. 深搜简单地说就是直接一搜到底,然后再回溯,再一搜到底,一直如此循环到没有新的结点. 广搜简单地说就是一层一层的搜,像水的波纹一样 ...

  9. HDU 5652(二分+广搜)

    题目链接:http://acm.hust.edu.cn/vjudge/contest/128683#problem/E 题目大意:给定一只含有0和1的地图,0代表可以走的格子,1代表不能走的格 子.之 ...

随机推荐

  1. 创建Uboot 环境变量 bin 文件

    As we know, the bootloader stores its configuration into an area of the flash called the environment ...

  2. Video Mode Timings

    A monitor draws an image on the screen by using an electron beam (3 electron beams for color models, ...

  3. VBA-数据库操作

    基本概念 1 怎么样才能操作数据库?使用ADO建立和数据库的连接,然后用ADO对象和sql语言对数据库进行操作. 2 SQL是什么?SQL(Structured Query Language)是一种查 ...

  4. 转载:php excel 的处理

    下面是总结的几个使用方法 include 'PHPExcel.php'; include 'PHPExcel/Writer/Excel2007.php'; //或者include 'PHPExcel/ ...

  5. 解决PageHelper.startPage(page, size)后,关于PageInfo的total等属性不正确等问题

    在解决PageHelper.startPage(page, size);的位置问题后,又遇到total等信息错误,主要还是不细心,两个不同的List实例化进PageInfo,不能混在一起,同时要确保这 ...

  6. MariaDB 更新查询

    UPDATE 命令通过更改值来修改现有字段. 它使用SET子句指定要修改的列,并指定分配的新值. 这些值可以是字段的表达式或默认值. 设置默认值需要使用DEFAULT关键字. 该命令还可以使用WHER ...

  7. UNP学习第七章

    一.套接口选项 函数getsockopt和setsockopt 函数fcntl 函数ioctl 二.getsockopt和setsockopt函数 #include <sys/socket.h& ...

  8. centos7 安装VMware tools 出现The path "" is not a valid path to the 3.10.0-514.el7.x86_64 kernel headers

    执行:yum install "kernel-devel-uname-r == $(uname -r)"

  9. hdu 5279 YJC plays Minecraft——生成函数

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5279 令 n 个点的树的 EGF 是 g(x) ,则 \( g(x) = \sum\limits_{i=0 ...

  10. 2019 TCO Round 1B——[ 状压DP ]

    第一题是 EllysSki . 题意:给n个数,求两个方向的最长递减区间. 可以O(n). #include<cstdio> #include<cstring> #includ ...