国产探花免费观看_亚洲丰满少妇自慰呻吟_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#抽象類總結

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 桦南县| 庆安县| 长治市| 环江| 郁南县| 芮城县| 正镶白旗| 类乌齐县| 鄯善县| 镇安县| 新余市| 黑水县| 湟源县| 宁津县| 五台县| 普兰店市| 綦江县| 临洮县| 平利县| 合肥市| 盐城市| 永寿县| 平远县| 新泰市| 肇州县| 临汾市| 延长县| 行唐县| 栾川县| 墨脱县| 张家川| 永修县| 洛宁县| 沛县| 确山县| 项城市| 布尔津县| 阿克陶县| 长白| 油尖旺区| 方正县|