UVa872 - Ordering(拓扑排序)

简介: UVa872 - Ordering(拓扑排序)
#include <cstdio>#include <cstring>#include <cctype>#include <map>usingnamespacestd;
constintN=220;
constintM=30;
charbuf[N];
boolvis[N];
intt, n;
intg[M][M];
map<char, int>chMap;
map<int, char>intMap;
charans[M];
intp[N], r[N];
voidinput();
voidtoposort(intdep);
boolisCycle();
intfind(intx);
boolUnion(intu, intv);
voidsolve();
intmain()
{
#ifndef ONLINE_JUDGEfreopen("e:\\uva_in.txt", "r", stdin);
#endifintcas;
scanf("%d", &cas);
gets(buf);
while (cas--) {
input();
solve();
if (cas) printf("\n");
    }
return0;
}
voidinput()
{
gets(buf);
gets(buf);
chMap.clear();
intMap.clear();
for (inti=0, len=strlen(buf); i<len; i++) {
if (isalpha(buf[i])) {
intsize=chMap.size();
chMap[buf[i]] =size;
intMap[size] =buf[i];
        }
    }
memset(g, 0x00, sizeof(g));
gets(buf);
for (inti=0, len=strlen(buf); i<len; i+=4) {
chartmp[4];
sscanf(&buf[i], "%s", tmp);
intu=chMap[tmp[0]], v=chMap[tmp[2]];
g[u][v] =1;
    }
n=chMap.size();
}
intfind(intx)
{
introot=x;
while (p[root] !=root) {
root=p[root];
    }
while (p[x] !=root) {
inttmp=x;
x=p[x];
p[tmp] =root;
    }
returnroot;
}
boolUnion(intu, intv)
{
intpu=find(u), pv=find(v);
if (pu==pv) returnfalse;
if (r[pu] <r[pv]) p[pu] =pv;
else {
p[pv] =pu;
if (r[pu] ==r[pv]) r[pu]++;
    }
returntrue;
}
boolisCycle()
{
for (inti=0; i<n; i++) {
p[i] =i;
r[i] =0;
    }
for (inti=0; i<n; i++) {
for (intj=0; j<n; j++) {
if (g[i][j]) {
if (!Union(i, j)) returnfalse;
            }
        }
    }
returntrue;
}
voidtoposort(intdep)
{
if (dep==n) {
for (inti=0; i<n; i++) {
if (i) printf(" ");
printf("%c", ans[i]);
        }
printf("\n");
return;
    }
for (inti=0; i<n; i++) {
if (vis[i]) continue;
intj;
for (j=0; j<n; j++) {
if (j!=i&&!vis[j] &&g[j][i]) break;
        }
if (j>=n) {
vis[i] =true;
ans[dep] =intMap[i];
toposort(dep+1);
vis[i] =false;
        }
    }
}
voidsolve()
{
if (!isCycle()) {
printf("NO\n");
return;
    }
memset(vis, false, sizeof(vis));
toposort(0);
}
目录
相关文章
抽象类和接口有什么区别?
抽象类和接口有什么区别?
|
9月前
|
数据安全/隐私保护
基于双PI+SVPWM的船舶用PMSM控制系统simulink建模与仿真
本课题基于双PI控制器与SVPWM技术,构建船舶用永磁同步电机(PMSM)控制系统的Simulink模型并进行仿真。系统采用电流内环与速度外环的双闭环结构,实现快速响应、高精度的电流与速度控制。SVPWM模块将电压参考值转化为三相PWM信号驱动逆变器。通过MATLAB2022a完成建模与仿真,验证了系统在高性能、环境适应性及控制精度方面满足船舶推进需求,适用于复杂海洋工况。
|
10月前
|
人工智能 安全 IDE
一天成为Java开发高手:用飞算JavaAI实现十倍提效
“一天成为Java开发高手”曾被视为天方夜谭,但飞算JavaAI的出现改变了这一局面。这款AI开发助手通过智能引导、需求分析、自动化逻辑处理和完整代码工程生成,大幅简化了Java开发流程。它不仅帮助新手快速上手,还让资深开发者提高效率,减少调试时间。现在,参与“飞算JavaAI炫技赛”,展示你的开发实力,赢取丰厚奖品!
|
C语言 开发者
【C语言】数学函数详解
在C语言中,数学函数是由标准库 `math.h` 提供的。使用这些函数时,需要包含 `#include <math.h>` 头文件。以下是一些常用的数学函数的详细讲解,包括函数原型、参数说明、返回值说明以及示例代码和表格汇总。
522 6
|
机器学习/深度学习 人工智能 算法
人工智能的伦理困境与技术挑战
在AI技术的迅猛发展中,伦理问题和技术性挑战日益凸显。本文将深入探讨AI伦理问题的多维度挑战,包括数据隐私、算法偏见和自动化失业等,并分析当前AI技术面临的主要技术性挑战,如可解释性、安全性和通用智能的实现问题。通过引用权威研究和统计数据,本文旨在为读者提供一个关于AI伦理和技术挑战的全面视角,促进对AI未来发展的深入思考。
448 31
|
数据采集 SQL 安全
Minerva -- Airbnb 的大规模数据指标系统 Part 1
Minerva -- Airbnb 的大规模数据指标系统 Part 1
1338 0
Minerva -- Airbnb 的大规模数据指标系统 Part 1
|
机器学习/深度学习 网络安全 异构计算
教你如何用家里闲置的Windows电脑搭建GPU服务器炼丹
教你如何用家里闲置的Windows电脑搭建GPU服务器炼丹
1993 0
教你如何用家里闲置的Windows电脑搭建GPU服务器炼丹
|
存储 Java 程序员
面向对象编程(C++篇4)——RAII
面向对象编程(C++篇4)——RAII
135 0
|
Java
HDU-2199-Can you solve this equation
HDU-2199-Can you solve this equation
93 0
|
机器学习/深度学习 iOS开发 MacOS
MAC系统机器学习环境配置常见问题
MAC系统机器学习环境配置常见问题