CodeForces 412D - Giving Awards (dfs)
2014-04-27 21:17
344 查看
题目大意:
R1公司的CEO要给员工发奖金,员工一个个地进CEO的办公室领奖金。但有的员工之间有债务关系,若A君欠B君的钱,当A君领完奖金后下一个领奖金的是B君的时候,他们就会相遇,A君就要马上还钱给B君,那么A君领到奖金的高兴心情也就变得没有那么高兴了。CEO不希望出现这种情况,要你帮他列出一个不会发生这种情况的召唤员工的顺序~若无这种顺序则输出-1.(不会出现A欠B钱,B也欠A钱的情况)
解题思路:
比赛时做完ABC没时间没看这题看的E题,后来做的时候刚开始以为是求一个欧拉道路,画了草图之后发现不是,研究了下发现是有向图dfs顺序输出。因为有可能不是连通图,所以要把整个森林的节点都输出一次。
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
int n, m;
vector<int> g[30005];
int vis[30005];
void dfs (int u)
{
if (vis[u]) // 递归边界1
return;
vis[u]=1;
for (int v=0; v<g[u].size(); v++) // 递归边界2:树中最底层的结点没有指向下一个结点的边
{
dfs(g[u][v]); // dfs
}
printf("%d ", u); // 输出当前结点
}
int main()
{
memset(vis, 0, sizeof(vis));
scanf("%d %d", &n, &m);
while (m--)
{
int a, b;
scanf("%d %d", &a, &b);
g[a].push_back(b); // 按题目要求,输出时b在前a在后 所以压边时压成a->b的边 后面调用dfs逆序输出刚好反转成顺序的结点
}
for (int i=1; i<=n; i++) // 遍历每个结点 若找到森林中未访问过的树的结点 则进行dfs
{
if (!vis[i])
dfs(i);
}
puts("");
return 0;
}
R1公司的CEO要给员工发奖金,员工一个个地进CEO的办公室领奖金。但有的员工之间有债务关系,若A君欠B君的钱,当A君领完奖金后下一个领奖金的是B君的时候,他们就会相遇,A君就要马上还钱给B君,那么A君领到奖金的高兴心情也就变得没有那么高兴了。CEO不希望出现这种情况,要你帮他列出一个不会发生这种情况的召唤员工的顺序~若无这种顺序则输出-1.(不会出现A欠B钱,B也欠A钱的情况)
解题思路:
比赛时做完ABC没时间没看这题看的E题,后来做的时候刚开始以为是求一个欧拉道路,画了草图之后发现不是,研究了下发现是有向图dfs顺序输出。因为有可能不是连通图,所以要把整个森林的节点都输出一次。
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
int n, m;
vector<int> g[30005];
int vis[30005];
void dfs (int u)
{
if (vis[u]) // 递归边界1
return;
vis[u]=1;
for (int v=0; v<g[u].size(); v++) // 递归边界2:树中最底层的结点没有指向下一个结点的边
{
dfs(g[u][v]); // dfs
}
printf("%d ", u); // 输出当前结点
}
int main()
{
memset(vis, 0, sizeof(vis));
scanf("%d %d", &n, &m);
while (m--)
{
int a, b;
scanf("%d %d", &a, &b);
g[a].push_back(b); // 按题目要求,输出时b在前a在后 所以压边时压成a->b的边 后面调用dfs逆序输出刚好反转成顺序的结点
}
for (int i=1; i<=n; i++) // 遍历每个结点 若找到森林中未访问过的树的结点 则进行dfs
{
if (!vis[i])
dfs(i);
}
puts("");
return 0;
}
相关文章推荐
- codeforces 412D. Giving Awards (dfs)
- CodeForces - 580C Kefa and Park (dfs)
- codeforces-#476B. Dreamoon and WiFi(dfs、二进制枚举)
- codeforces 686D D. Kay and Snowflake(dfs)
- codeforces 723D. Lakes in Berland [DFS]【】
- 【CodeForces 525D】【dfs+思维】 Arthur and Walls 【只包含点和星的矩阵,需要将部分星变成点使点能组成矩形 】
- CodeForces 682C - Alyona and the Tree(dfs)
- Codeforces 466E Information Graph【Dfs处理父子关系+并查集+离线查询】好题!
- Codeforces 34C Page Numbers(简单图论+DFS)
- codeforces 691D D. Swaps in Permutation(dfs)
- CodeForces - 510B Fox And Two Dots(DFS)
- CodeForces 780C Andryusha and Colored Balloons【DFS】
- CodeForces 550B Preparing Olympiad 简单DFS
- Codeforces 525D Arthur and Walls 【Dfs+思维】
- CodeForces - 711D Directed Roads(dfs判环)
- 【codeforces 691 D】【并查集 或者 dfs】aps in Permutation【给一个1到N的排列,M个操作,每次可以交换X Y位置上的数字,求可以得到的最大字典序的数列】
- codeforces 510B Fox And Two Dots(dfs)
- CodeForces 723D-Lakes in Berland(BFS DFS)
- Codeforces - Gym - 100187J. Deck Shuffling - dfs
- Codeforces 9C Hexadecimal‘s number (DFS)