?? contree.cpp
字號:
#include "iostream.h"
#include <fstream>
using namespace std;
struct Cnode //用結(jié)構(gòu)體來表示結(jié)點(diǎn)
{
long weight; //結(jié)點(diǎn)的權(quán)值
int father; //結(jié)點(diǎn)的父親結(jié)點(diǎn)
int childnum; //結(jié)點(diǎn)的兒子個數(shù)
long wMax; //結(jié)點(diǎn)的最大連通分支權(quán)值
bool visited; //該結(jié)點(diǎn)是否被訪問過
};
int main()
{
ifstream fin("input.txt");
ofstream fout("output.txt");
int i;
long n,u,v;
fin>>n;
Cnode *tree=new Cnode[n+1];//動態(tài)創(chuàng)建數(shù)組表示樹
for (i=1;i<=n;i++) //樹結(jié)構(gòu)初始化并輸入數(shù)據(jù)
{
tree[i].father=0;
tree[i].childnum=0;
tree[i].visited=false;
fin>>(tree[i].weight);
tree[i].wMax=tree[i].weight;
}
for (i=1;i<=(n-1);i++)//輸入數(shù)據(jù)
{
fin>>u>>v;
tree[v].father=u;
tree[u].childnum++;
}
int root;
for (i=1;i<=n;i++)//確定樹根
if (tree[i].father==0)
root=i;
while (tree[root].childnum>0)//遍歷樹
{
for (i=1;i<=n;i++)
if ((tree[i].childnum==0)&&(!tree[i].visited))
{
tree[i].visited=1;
tree[tree[i].father].childnum--;
if (tree[i].wMax>0)
tree[tree[i].father].wMax=tree[tree[i].father].wMax+tree[i].wMax;
}
}
long max=tree[1].wMax;
for (i=2;i<=n;i++)//求出最大的連通分支權(quán)值
if (tree[i].wMax>max)
max=tree[i].wMax;
fout<<max;
delete [] tree;
return 0;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -