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;
}

浙公网安备 33010602011771号