您的位置:首页 > 其它

拓扑排序还能这么写 zoj 2997

2015-07-16 13:56 260 查看
#include <cstdio>
#include <cstring>
using namespace std;
#define LL long long
#define CL(a, val) memset(a, val, sizeof(a))

int n, p, q;
int b[5005];
int idx;

bool dfs(int u)
{
b[u] = -1;
int v = u - p;
if(v >= 0)
{
if(b[v] < 0)
return 0;
else if(!b[v] && !dfs(v))
return 0;
}
v = u + q;
if(v <= n)
{
if(b[v] < 0)
return 0;
else if(!b[v] && !dfs(v))
return 0;
}
b[u] = idx ++;
return 1;
}

bool topo()
{
CL(b, 0);
idx = 1;
for(int i = 0; i <= n; ++ i)
{
if(!b[i])
{
if(!dfs(i))
return false;
}
}
return true;
}

int main()
{
#if _MSC_VER == 1500
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif
while(scanf("%d%d%d", &n, &p, &q) == 3)
{
if(!topo())
printf("NO\n");
else
{
printf("YES\n");
for(int i = 1; i <= n; ++ i)
{
if(i != 1)
printf(" ");
printf("%d", b[i] - b[i - 1]);
}
printf("\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: