指针的值是地址 2020-02-20 22:59 采纳率: 100%
浏览 370

PAT 甲级 代码 只通过4分

题目大意 假如A和B有通话,就称他们是有关系的。并且A和B之间的权值就是他们通话的时间。一个匪帮被假定为有两个人以上,以及他们之间的权值之和(也就是通话时间之和)超过一个给定的阈值K。在每个匪帮中首领被定义为权值最大的人。现在你需要找出匪帮以及其首领。

   显然这是道图的问题。匪帮的个数也就是图的连通分量,可以先用DFS求出图的连通分量,判断各个连通分量的顶点个数是否超过2以及权值之和是否超过阈值K
#include <iostream>
#include <stack>
#include <queue>
using namespace std;

struct node {
    int c;  //表示结点的字符值
    int w;   //表示权重
};

struct out1 {   // 用于输出,
    char c1;   //记录输出的那个字符
    int num;    //记录输出的每个组的成员个数
    friend bool operator < (out1 o1, out1 o2) {
        return o1.c1 > o2.c1;    //ASCII码大的排在后面。即按照字母序排序。
    }
};

priority_queue<out1>pq1;

int main() {
    int N = 0;  //N组数据
    int K = 0;  //门限值为K
    cin >> N >> K;
    if (N < 0 || N>1000) { return -1; }
    if (K < 0 || K>1000) { return -1; }
    int Gra[26] = {0}; //记录每个点的权重
    bool flag2[26] = { false };
    int flag1[26][26] = { 0 };//表示这两个点之间有边,无向图。
    //输入数据,更新相应的数组信息。
    for (int i = 0; i < N; i++) {
        string s1, s2;
        cin >> s1; cin >> s2;
        int w1;
        cin >> w1;
        Gra[((int)s1[0]) - 65] = Gra[((int)s1[0]) - 65] + w1; //记录每个点的权重
        Gra[((int)s2[0]) - 65] = Gra[((int)s2[0]) - 65] + w1;
        flag1[((int)s1[0]) - 65][((int)s2[0]) - 65] = flag1[((int)s1[0]) - 65][((int)s2[0]) - 65] + w1;  //表示这两个点之间的边,无向图。
        flag1[((int)s2[0]) - 65][((int)s1[0]) - 65] = flag1[((int)s1[0]) - 65][((int)s2[0]) - 65];
    }   
    //接下来是DFS
    stack<node>s3;
    for (int i4 = 0; i4 < 26; i4++) {
        node t;
        int total = 0;//记录总的权值。
        int max2 = 0;  //记录点权最大的值
        int max1 = 0;//记录最大点权的下标。
        for (int i = 0; i < 26; i++) {
            if (Gra[i] > 0 && !flag2[i]) {
                t.c = i;
                t.w = Gra[i];
                s3.push(t);
                flag2[i] = true;
                max2 = Gra[i];
                max1 = i;
                break;
            }
        }  //找到第一个字符,开始。
        if (s3.empty()) { break; }  //如果每个元素都已经处理了一遍了。直接返回。
        int k3 = 1;   //表示个数
        while (!s3.empty()) {
            node t1 = s3.top();
            int i1 = 0;
            for (; i1 < 26; i1++) {
                if (flag1[t1.c][i1]) { node t2; t2.c = i1; t2.w = Gra[i1]; total = total + flag1[t1.c][i1]; s3.push(t2);
                                       if (Gra[i1] > max2) { max2 = Gra[i1]; max1 = i1; }
                                       if (!flag2[i1]) { k3++; flag2[i1] = true; }
                                       flag1[t1.c][i1] = flag1[i1][t1.c] = 0; break;}
            }
            if (i1 == 26) { s3.pop(); }
        }
        if (k3> 2 && total>K ) { out1 out; out.num = k3; out.c1 = (char)(max1 + 65); pq1.push(out); }
    }
    int k2 = pq1.size();
    if (k2 > 0) {
        cout << k2<<endl;
        while (!pq1.empty()) {
            cout << pq1.top().c1 << pq1.top().c1 << pq1.top().c1 << " " << pq1.top().num <<endl;
            pq1.pop();
        }
    }
    else { cout << 0; }
    return 0;
}

只通过两个测试点,郁闷。

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥20 sub地址DHCP问题
    • ¥15 delta降尺度计算的一些细节,有偿
    • ¥15 Arduino红外遥控代码有问题
    • ¥15 数值计算离散正交多项式
    • ¥30 数值计算均差系数编程
    • ¥15 redis-full-check比较 两个集群的数据出错
    • ¥15 Matlab编程问题
    • ¥15 训练的多模态特征融合模型准确度很低怎么办
    • ¥15 kylin启动报错log4j类冲突
    • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大