、简介

        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. 【报错】解决logstash tracking_column not found in dataset. {:tracking_column=>"updated_time"}问题

    今天用logstash同步数据库记录到elasticsearch时候出现错误,错误信息如下: [2019-10-12T23:51:00,529][WARN ][logstash.inputs.jdbc ...

  2. Java线程的优先级设置遵循什么原则?

    Java线程的优先级设置遵从下述原则: (1) 线程创建时,子线程继承父线程的优先级 (2) 线程创建后,可在程序中通过调用setPriority( )方法改变线程的优先级 (3) 线程的优先级是1~ ...

  3. find和grep技巧

    1. find ./ -name "*streaming*"  查找文件 2.  grep -r KUBE_LOGTOSTDERR /etc/kubernetes/*  查找内容

  4. cocos2D-X call JNIHelper

    #ifndef _WIN32 JNIEnv *j = JniHelper::getEnv(); if (j == nullptr || j == NULL) {test += "JNIEnv ...

  5. jdbc——java连接sql server 过程

    首先要去下一个关于sql的驱动jar包,叫做sqljdbc4.jar 然后更新项目的build path,加入这个jar包 前几步有问题的看该博客 https://blog.csdn.net/qq24 ...

  6. Mysql安装和简单设置

    MySQL安装文件分为两种,一种是msi格式的,一种是zip格式的.如果是msi格式的可以直接点击安装,按照它给出的安装提示进行安装(相信大家的英文可以看懂英文提示),一般MySQL将会安装在C:\P ...

  7. JSHOP2

    JSHOP2是一个HTN(hierarchy task network)规划器,是SHOP2(simple hierarchy ordered planner )的java实现版本. SHOP2的官网 ...

  8. rsync+inotify实现实时同步案例

    转自:http://chocolee.blog.51cto.com/8158455/1400596 随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐 ...

  9. switch gnome-terminal tabs

    Ctrl+Page Down (forward) and Ctrl+Page Up (backward). http://unix.stackexchange.com/a/67963

  10. 2019 ACM-ICPC 南京 现场赛 H. Prince and Princess

    题意 王子想要娶公主,但是需要完成一个挑战:在一些房间中找出公主在哪. 每个房间有一个人,他们彼此知道谁在哪个房间.可以问他们三种问题: 你是谁? 在某个房间是谁? 公主在哪个房间? 有三类人,一类一 ...