您的位置:首页 > 其它

Codeforces Round #216 (Div. 2) 解题报告

2013-11-30 09:11 441 查看
Problem A Valera and Plates

有碗和碟子两种容器,小明每天吃一种食物,食物有两种1只能用碗吃2两个容器都可。给你初始的碗与碟子问小明至少要洗多少个碗或碟子。

简单模拟,能用碟子就用碟子。

代码如下:

#include <iostream>
#include <fstream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <utility>
#include <vector>
#include <queue>
#include <stack>
#define INF 0x7fffffff
#define LEN 101000
#define ll long long
#define eps 1E-6

using namespace std;

vector<pair<int,int> > Map[LEN];
int n, vis[LEN], vv[LEN];

int DFS(int root, int fa)
{
int ret = 0, flag = 1;
for(int i=0; i<Map[root].size(); i++){
//        if(vv[i])continue;
//        vv[i] = 1;
if(Map[root][i].first==fa){
flag = Map[root][i].second;
continue;
}
ret+=DFS(Map[root][i].first, root);
}
if(ret==0 && flag==2)return vis[root]=1;
return ret;
}

int main()
{
//    freopen("in.txt", "r", stdin);
while(scanf("%d", &n)!=EOF){
memset(vis, 0, sizeof vis);
memset(vv, 0, sizeof vv);
for(int i=0; i<LEN; i++)Map[i].clear();
for(int i=1; i<n; i++){     //build Map
int a, b, val;
scanf("%d%d%d", &a, &b, &val);
Map[a].push_back(make_pair(b, val));
Map[b].push_back(make_pair(a, val));
}
int ans = DFS(1, -1);
printf("%d", ans);
for(int i=1; i<=n; i++){
if(vis[i]){
printf(" %d", i);
}
}
printf("\n");
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: