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

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

1053. Path of Equal Weight (30)

2019-11-11 02:42:31
字體:
來源:轉載
供稿:網友

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;}
上一篇:強制類型轉換

下一篇:C#抽象類總結

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 酉阳| 安福县| 陆良县| 同仁县| 武冈市| 天全县| 密山市| 通河县| 玛曲县| 法库县| 常宁市| 郁南县| 珲春市| 横山县| 柞水县| 佛学| 合水县| 刚察县| 自贡市| 遵义市| 浠水县| 宾阳县| 昌图县| 盐源县| 抚顺市| 江油市| 定边县| 尚志市| 西平县| 京山县| 西平县| 炎陵县| 禹州市| 鄱阳县| 德安县| 隆尧县| 天峻县| 龙川县| 贡嘎县| 大宁县| 遂宁市|