zoukankan      html  css  js  c++  java
  • 华为笔试题2

    求某个人的n度好友:
    对于一个小集体(一组数据),a是b的好友,友好度为x; b是c的好友,友好度为y;且a和c不是好友,那么称c为a的2度好友,友好度为x+y; b为a的1度好友,友好度为x;
    现在输入数据:
    第1行:T,代表总共有n组数据,如下面为2;
    第2~3行:分别输入第1组数据的不同参数,
      第2行:m , i , n;
        m=10代表这组有10个人,则每个人的编号为0~9;
        i=5 代表求编号为5的人的好友关系;
        n=2 代表求5号的2度好友,没有输出-1;如果有的话,则按照友好度降序排列,如果友好度相同,则按照人的编号升序排列;
      第3行:第一个数字k=13表示第1组总共有13个朋友关系,0 3 5代表0号和3号的友谊度为5,依次类推;
    按顺序输出:第i号的n度好友,如果T等于2那么应该输出两组关系;
    2 10 5 2 13 0 3 5 ...省略后面

    C++代码:

    #include<iostream>
    #include<vector>
    #include<string>
    #include<queue>
    #include<algorithm>
    using namespace std;
    bool cmp(vector<int> a,vector<int> b){
        return a[1]>b[1];
    }
    int main(){
        int T;
        cin>>T;
        for(int id=0;id<T;id++){
            int m,i,n;
            cin>>m>>i>>n;
            int k;
            cin>>k;
            //朋友圈图初始化
            vector<vector<int> > g(m,vector<int>(m,0));
            for(int x=0;x<k;x++){
                int a,b,w;
                cin>>a>>b>>w;
                g[a][b]=g[b][a]=w;
            }
            vector<int> visit(m,0);
            queue<int> q;
    
            //初始化1度好友
            for(int x=0;x<m;x++){
                if(g[i][x]!=0){
                    q.push(x);
                    visit[x]=g[i][x];
                }
            }
            //广度优先搜索
            //第一层,找n度好友
            for(int x=1;x<n;x++){
                int len=q.size();
                //第二层,把当前度的好友找完,共y个好友;
                for(int y=0;y<len;y++){
                    int a=q.front();
                    q.pop();
                    //第三层,对当前第x度寻找所有下一个度的好友
                    for(int z=0;z<m;z++){
                        if(z!=i && g[a][z]!=0 && visit[z]==0){
                            q.push(z);
                            visit[z]=visit[a]+g[a][z];
                        }
                        if(visit[z]!=0 && visit[z]<visit[a]+g[a][z]) visit[z]=visit[a]+g[a][z];
                    }
                }
            }
            vector<int> ndf;
            if(q.size()==0){
                cout<<-1<<endl;continue;
            }else{
                while(!q.empty()){
                    ndf.push_back(q.front());
                    q.pop();
                }
            }
            int max_x=ndf.size();
            vector<vector<int> > res;
    
            sort(ndf.begin(),ndf.end());
    
            for(int x=0;x<max_x;x++){
                vector<int> cell;
                cell.push_back(ndf[x]);
                cell.push_back(visit[ndf[x]]);
                res.push_back(cell);
            }
            sort(res.begin(),res.end(),cmp);
            for(int x=0;x<max_x;x++){
                cout<<res[x][0]<<" ";
            }
            cout<<endl;
        }
        return 0;
    }
    
    /*
    2
    10 5 2
    13 0 3 5 0 4 9 0 6 8 0 7 5 1 2 6 1 6 3 2 9 7 3 4 3 3 5 3 3 8 3 3 9 3 5 8 9 7 8 9
    10 0 2
    13 0 3 5 0 4 9 0 6 8 0 7 5 1 2 6 1 6 3 2 9 7 3 4 3 3 5 3 3 8 3 3 9 3 5 8 9 7 8 9
    */
  • 相关阅读:
    LVS---服务器集群系统
    I/O的基本概念
    rsync+cron同步文件服务
    IAAS、PAAS、SAAS及公有云、私有云概念
    Python3456学习结构
    Python列表常用函数解析
    Python字符串常用函数详解
    验证码生成
    Python随机数生成random.randint()与np.random.randint()
    python在线&离线安装第三库的方法
  • 原文地址:https://www.cnblogs.com/joelwang/p/11440510.html
Copyright © 2011-2022 走看看