PAT-甲级-1034 Head of a Gang (有向图DFS)没满分!

题目:

找出有向图中的节点大于2的连通子图,输出其中所有权值和大于threshold的head节点,head节点是该图中输入输出权值和最高的节点

思路

Code:

#include<iostream>
#include<vector>
#include<map>
using namespace std;
#define max_size 1010
struct head{
    int id, total_val, head_val, sum = 0;
};
map<string ,int>dic;
map<int, string>dic_t;

vector<vector<int>>m;
vector<vector<int>>v;
vector<bool>flag;

head dfs(int p, head &h)
{   
    int t = 0;
    for(int i = 0; i < dic.size(); i++)
    {
        if(m[i][p] != 0)
            t += m[i][p];
        if(m[p][i] != 0)
            t += m[p][i];      
    }
    if(t > h.head_val)
    {
        h.head_val = t;
        h.id = p;
    }
    for(int i = 0; i < dic.size(); i++)
    {
        if(m[p][i] != 0 && v[p][i] == 0)
        {
            if(flag[i] == 0)
            h.sum++;
            flag[i] = 1;
            h.total_val += m[p][i] + m[i][p];
            v[p][i] = 1;
            v[i][p] = 1;
            dfs(i, h);
            //flag[i] = 0;
        }
    }
    return h;
}


//vector<edge>m[n];

int main()
{
    int n, threshold;
    cin>>n>>threshold;

    int index = 0;
    m.resize(max_size, vector<int>(max_size, 0));
    v.resize(max_size, vector<int>(max_size, 0));
    for(int i = 0; i < n; i++)
    {
        string s1, s2;
        int val;
        cin>>s1>>s2>>val;
        if(dic.count(s1) == 0)
        {
            dic[s1] = index;
            dic_t[index] = s1;
            index++;
        }
        if(dic.count(s2) == 0)
        {
            dic[s2] = index;
            dic_t[index] = s2;
            index++;
        }
            
        /*edge e;
        e.to = dic[s2];
        e.weight = val;*/
        m[dic[s1]][dic[s2]] = val;
    }

    vector<head>heads;
    flag.resize(dic.size(), 0);
    for(int i = 0; i < dic.size(); i++)
    {
        if(flag[i] == 0)
        {
           head h;
           h.id = 0;
           h.head_val = 0;
           h.total_val = 0;
           h.sum++;
           flag[i] = 1;
           h = dfs(i, h);
           //cout<<h.id<<' '<<h.total_val<<endl;
           if(h.total_val > threshold && h.sum > 2)
           heads.push_back(h); 
        }
    }
    cout<<heads.size()<<endl;
    for(int i = 0; i < heads.size(); i++)
    {
        cout<<dic_t[heads[i].id]<<' '<<heads[i].sum<<endl;
    }
    
   return 0; 
}
posted @ 2021-03-27 17:59  liushz  阅读(36)  评论(0)    收藏  举报