国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

1053. Path of Equal Weight (30)

2019-11-11 04:07:45
字體:
來源:轉載
供稿:網友

1. 原題: https://www.patest.cn/contests/pat-a-PRactise/1053

2. 思路:

題意:遍歷出從根到葉子路徑的總權值與給定的相等的序列。思路:核心是dfs了。然后一個問題是序列從大到小輸出?怎么做呢。假設我們每次都從最大的孩子遞歸遍歷,那么結果正是我們要的。所以,我們對每個父結點的孩子降序排序后,再dfs就好了。已AC

3. 源碼(已AC):

#include<iostream>#include<algorithm>//使用sort函數#include<vector>using namespace std;vector<int> pwt;//存儲路徑的每個結點權值vector<int> nwt;//存儲樹的每個結點權值int N, M, S;//分別為總結點數, 非葉子節點數,給出的權值struct Node{	bool Operator<(const Node &b) const//重載比較運算符	{		return wgt > b.wgt;	}	int id;//結點編號	int wgt;//權值};vector< vector<Node> > vtree;//類似圖的鄰接表表示,嵌套vector,表示結點的孩子void dfs(int s, int sum);//dfs,參數為遍歷起點,累計的權值int main(void){	//freopen("in.txt", "r", stdin);	cin >> N >> M >> S;	nwt.resize(N);//重新定義數組大小	vtree.resize(N);	for (int i = 0; i < N; i++)//保存每個結點權值		cin >> nwt[i];	for (int i = 0; i < M; i++ )	{		int par, num;		cin >> par >> num;		vtree[par].resize(num);		for (int j = 0; j < num; j++)//每個孩子結點壓入父結點的數組中		{			Node tem;			cin >> tem.id;			tem.wgt = nwt[tem.id];			vtree[par][j] = tem;		}		sort(vtree[par].begin(), vtree[par].end());//降序排序	}		dfs(0, 0);	return 0;}void dfs(int s, int sum){	sum += nwt[s];	pwt.push_back(nwt[s]);	if (sum > S)//大于直接返回上一級		return;	if (sum == S && vtree[s].empty())//相等且為葉子結點,為所求,輸出結果	{		for (int i = 0; i < pwt.size(); i++)		{			if (i == 0)				cout << pwt[i];			else				cout << ' ' << pwt[i];		}		cout << endl;		return;	}	if (sum < S && vtree[s].size() > 0)//小于的話,繼續dfs	{		for (int i = 0; i < vtree[s].size(); i++)		{			dfs(vtree[s][i].id, sum);			pwt.pop_back();//從dfs里返回后要彈出最后壓入的		}	}	return;}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 苏尼特左旗| 义乌市| 六盘水市| 老河口市| 万宁市| 永新县| 吴旗县| 开鲁县| 周宁县| 金秀| 新绛县| 平远县| 鲁甸县| 碌曲县| 庆城县| 旬邑县| 老河口市| 锡林浩特市| 龙江县| 民乐县| 洛扎县| 南康市| 拜泉县| 定西市| 阿鲁科尔沁旗| 米脂县| 武清区| 罗山县| 晴隆县| 万荣县| 涿鹿县| 东平县| 红河县| 阜平县| 普兰店市| 宜春市| 汉阴县| 连云港市| 阿拉善盟| 九寨沟县| 景德镇市|