vector二维结构的使用

先看下面的代码段

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

int main(){
    vector<int> v[10];

    v[0].emplace_back(101);
    v[0].emplace_back(102);
    v[0].emplace_back(103);

    v[1].emplace_back(111);

    v[2].emplace_back(121);
    v[2].emplace_back(122);
    
    for(int i=0; i<4; i++){
        for(int j=0; j<v[i].size(); j++){
            if(j>0) cout << " ";
            cout << v[i][j];
        }
        cout << endl;
    }
}

输出结果

101 102 103
111
121 122

可见,代码中的v[i]可以看作一个数组,使用emplace_back()方法就可以实现动态增长,并且遍历起来也相对容易。这样的结构可以用来表示树或者无向图(例如 v[i] [j] 可以表示结点i的第j个子结点或者相邻结点)。PAT甲级真题中有关深度优先搜索的题目可以尝试使用这种方法。

1003 Emergency

示例代码

// 深度优先搜索

#include<iostream>
#include<vector>
#include<limits.h>
using namespace std;

int N, M, C1, C2;// 城市数,路数,起始城市,结束城市
int teamNum[500];// 每个城市救援队数量
vector<int> vec[500];   // 城市i的第t个相邻城市是vec[i][t]
int dis[500][500];  //城市i到城市j的距离
int minDis[500];    // 到城市i的最短距离
int pathNum, teamn;

void dfs(int curCity, int curLen, int curTeam){
    /*深度优先搜索
        curCity:当前城市  curLen:当前最短路径  curTeam:当前救援队总数
    */

    //当前已走过的距离大于最短路径
    if(curLen > minDis[curCity]) return;    

    //当前已到达C2城市
    if(curCity == C2){
        if(curLen == minDis[curCity]){//当前走过距离和mindis相等,即多了一条最短路径
            pathNum++;
            if(curTeam > teamn) teamn = curTeam;    //若当前救援队数量更大,更新救援队数量
        }else{  
            //当前走过的距离小于最短路径,直接更新最短路径数和救援队数目
            minDis[curCity] = curLen;
            pathNum = 1;
            teamn = curTeam;    
        }

    }else{  //当前在其他城市
        // 判断是否需要更新最小距离
        if(curLen < minDis[curCity]) minDis[curCity] = curLen;
        for(int i=0; i<(int)vec[curCity].size(); i++){
            int adjoinCity = vec[curCity][i];   // curCity的相邻城市
            // 遍历curCity的相邻城市
            dfs(adjoinCity, curLen+dis[curCity][adjoinCity], curTeam+teamNum[adjoinCity]);  
        }
    }

    
}

int main(){
    int pos;
    int i, j, len;  //城市i和城市j的路长度为len
    cin >> N >> M >> C1 >> C2;
    for(int pos=0; pos<N; pos++)  cin >> teamNum[pos];
    for(int pos=0; pos<M; pos++){
        cin >> i >> j >> len;
        vec[i].emplace_back(j);
        vec[j].emplace_back(i);
        dis[i][j] = dis[j][i] = len;
    }
    for(int pos=0; pos<N; pos++)  minDis[pos] = INT_MAX;
    
    dfs(C1, 0, teamNum[C1]);

    cout << pathNum << " " << teamn;
    
    return 0;
}

1004 Counting Leaves

示例代码

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

int nodeNum, nlNodeNum;     // 总结点数,非叶子的结点数
vector<int> childs[100];    // i结点的第j个子结点id为 childs[i][j]
int leafNum[100] = {0}, maxLevel; // 第i层的叶子结点数为leafNum[i]   最大层数maxLevel

void DFS(int curId, int curLevel){
    // curId:当前遍历的结点id  curLevel:当前遍历所在的层级,最上面为0层
    int childNum = childs[curId].size();

    // 若当前层级更大,更新maxLevel
    if(curLevel > maxLevel) maxLevel = curLevel;

    if(childNum==0){
        // 当前结点没有子结点
        leafNum[curLevel]++;    //更新当前层的叶子结点数
        return;
    }else{
        // 当前结点有子结点,遍历他的子结点(下一层级)
        for(int i=0; i<childs[curId].size(); i++){
            DFS(childs[curId][i], curLevel+1);
        }
    }
}

int main(){
    int pos, i;
    cin >> nodeNum >> nlNodeNum;
    for(pos=0; pos<nlNodeNum; pos++){
        int id, childNum;
        cin >> id >> childNum;
        for(i=0; i<childNum; i++){
            int childId;
            cin >> childId;
            childs[id].emplace_back(childId); 
        }
    }

    DFS(1, 0);
    
    for(pos=0; pos<=maxLevel; pos++){
        if(pos>0)   cout << " ";
        cout << leafNum[pos];
    }
    
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晚风也很浪漫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值