SRM 591 DIV1 Easy - TheTree (復習×○)

問題


http://community.topcoder.com/stat?c=problem_statement&pm=12746&rd=15703

グラフの各深さに対する頂点数が与えられる。
このとき、そのグラフの直径を求める。

解き方


グラフを最大のケースで作ってもよいが、場合分けをすれば簡単に求められる。

まず、答えの最小は各深さの頂点が1のとき、つまり深さ+1(要素数)となる。

次に、直径の長さはその深さにおける頂点数が1もしくは2以上の場合しか影響されない。

②頂点数が2以上の場合
 折り返し分の直径が増えるので、その値と比較して最大値を更新

①頂点数が1の場合
 折り返し分はリセットされる。
 リセットされた際の最大値の更新は①で比較済み。

コード


using namespace std;

#define all(c) (c).begin(),(c).end()
#define FORE(i,d,e) for(int i=d;i<e;i++)
#define FOR(i,s,e) for (int i = int(s); i != int(e); i++)
#define FORIT(i,c) for (typeof((c).begin()) i = (c).begin(); i != (c).end(); i++)
#define ISEQ(c) (c).begin(), (c).end()

class TheTree {

public: int maximumDiameter(vector<int> cnt) {
int n=cnt.size();
int ret=n;

int last=-1,len=0;
FORE(i,0,n){
if(cnt[i]==1){
last=i,len=0;
}
else{
len++;
ret=max(ret,n-last-1+len);
}
}

return ret;
}

};

using namespace std;

#define all(c) (c).begin(),(c).end()
#define FORE(i,d,e) for(int i=d;i<e;i++)
#define FOR(i,s,e) for (int i = int(s); i != int(e); i++)
#define FORIT(i,c) for (typeof((c).begin()) i = (c).begin(); i != (c).end(); i++)
#define ISEQ(c) (c).begin(), (c).end()

class TheTree {

public: int maximumDiameter(vector<int> cnt) {
int n=cnt.size();

int ret=0;

vector<int> vx;
vx.push_back(1);
FORE(i,0,n)vx.push_back(cnt[i]);

FORE(i,0,n+1)if(vx[i]==1){
int left=0,right=0,flag=0;
FORE(j,i+1,n+1){
if(vx[j]==1||flag)flag=1,left++;
else left++,right++;
ret=max(ret,left+right);
}
}

return ret;

}

};
このエントリーをはてなブックマークに追加