Codeforces 638C Road Improvement 【DFS】

题目链接:Codeforces 638C Road Improvement

题意:给定一棵树,你可以使用两支相邻城市的队伍来修筑它们之间的道路 且 每支队伍一天只能工作一次。问最少需要多少天把所有路修完。输出方案数。

个人瞎扯淡:与父亲的连边——父亲边,同理孩子边。
思路:首先对于一个根来说,它的孩子边一定是在不同天完成的。这样我们从第一天开始分别给它孩子边分配日期,其次还要保证修筑父亲边和孩子边的日期不同,我们记录下修筑父亲边的日期然后每次比较下就好了。

AC 代码:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define PI acos(-1.0)
#define CLR(a, b) memset(a, (b), sizeof(a))
#define fi first
#define se second
#define ll o<<1
#define rr o<<1|1
using namespace std;
typedef long long LL;
typedef pair<int, int> pii;
const int MAXN = 2*1e5 + 1;
const int pN = 1e6;// <= 10^7
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
void add(LL &x, LL y) { x += y; x %= MOD; }
mapint> fp;
vector<int> G[MAXN], day[MAXN];
int ans;
void DFS(int u, int fa, int last) {
    int id = 0;
    for(int i = 0; i < G[u].size(); i++) {
        int v = G[u][i];
        if(v == fa) continue;
        id++; if(id == last) id++;
        day[id].push_back(fp[pii(u, v)]);
        DFS(v, u, id);
    }
    ans = max(ans, id);
}
int main()
{
    int n; cin >> n;
    for(int i = 1; i <= n; i++) G[i].clear();
    fp.clear();
    for(int i = 1; i <= n-1; i++) {
        int x, y; cin >> x >> y;
        fp[pii(x, y)] = fp[pii(y, x)] = i;
        G[x].push_back(y); G[y].push_back(x);
    }
    ans = 0; DFS(1, -1, 0);
    cout << ans << endl;
    for(int i = 1; i <= ans; i++) {
        cout << day[i].size();
        for(int j = 0; j < day[i].size(); j++) {
            cout << ' ' << day[i][j];
        }
        cout << endl;
    }
    return 0;
}

你可能感兴趣的:(DFS,&&,BFS,codeforces)