POJ 1094 Sorting It All Out (拓扑排序)

本文讨论了使用拓扑排序解决给定大写字母间偏序关系问题的方法,包括如何判断关系是否矛盾及是否能唯一确定关系。通过两次拓扑排序过程,文章详细解释了如何在给定关系中寻找矛盾或不确定性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:给你一些大写字母间的偏序关系,然后让你判断能否唯一确定它们之间的关系,或者所给关系是矛盾的,或者到最后也不能确定它们之间的关系。   由DAG图节点的偏序关系确定节点的排序可以由拓扑排序求出。而确定这些问题也可以由拓扑排序完成。 我们知道拓扑排序的过程是: 1.每次从队列中找出1个入度为0的点作为当前排序的点(加入到已排序的集合中) 2.从图中删除以这个点为起点的弧(即使所有的终点入度减1) 3.如果找不到入度为0的点则退出过程   那么我们来看拓扑排序的过程中怎么判断这几个问题: 1.如果某次找入度为0的点时有多个入度为0的点,则无法确定关系; 2.如果找不到入度为0的点退出过程,但是并不是所有的点都已经确定排序,则图中一定有环,即关系是矛盾的。   题目还隐形地要求判断矛盾在无法确定关系之前,所以我笨拙地用了两次拓扑排序,第一次确定是否矛盾,第二次再判断能否确定关系。  

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define MID(x,y) ((x+y)>>1)
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;

const int MAXE = 2000;
const int MAXV = 30;
struct node{
    int u, v;
    int next;
}arc[MAXE];
int cnt, head[MAXV], ind[MAXV];
void init(){
    cnt = 0;
    mem(head, -1);
    mem(ind, 0);
    return ;
}
void add(int u, int v){
    arc[cnt].u = u;
    arc[cnt].v = v;
    arc[cnt].next = head[u];
    head[u] = cnt ++;
    return ;
}
bool vis[MAXV];
vector  tsort;
vector  tmp;
queue  Q;
void topsort1(int n){
    tmp.clear();
    while(!Q.empty()){
        Q.pop();
    }
    mem(ind, 0);
    mem(vis, 0);
    for(int i = 0; i < cnt; i ++){
        ind[arc[i].v] ++;
    }
    int num = 0;
    for (int i = 0; i < n; i ++){
        if (ind[i] == 0){
            num ++;
            Q.push(i);
            vis[i] = 1;
        }
    }
    while(!Q.empty()){
        int u = Q.front();
        Q.pop();
        tmp.push_back(u);
        for (int i = head[u]; i != -1; i = arc[i].next){
            int v = arc[i].v;
            if (!vis[v]){
                ind[v] --;
                if (ind[v] == 0){
                    Q.push(v);
                    vis[v] = 1;
                }
            }
        }
    }
    return ;
}
bool topsort(int n){
    tsort.clear();
    while(!Q.empty()){
        Q.pop();
    }
    mem(ind, 0);
    mem(vis, 0);
    for(int i = 0; i < cnt; i ++){
        ind[arc[i].v] ++;
    }
    int num = 0;
    for (int i = 0; i < n; i ++){
        if (ind[i] == 0){
            if (num > 0){
                return false;
            }
            else{
                num ++;
                Q.push(i);
                vis[i] = 1;
            }
        }
    }
    while(!Q.empty()){
        if (Q.size() > 1)
            return false;
        int u = Q.front();
        Q.pop();
        tsort.push_back(u);
        for (int i = head[u]; i != -1; i = arc[i].next){
            int v = arc[i].v;
            if (!vis[v]){
                ind[v] --;
                if (ind[v] == 0){
                    Q.push(v);
                    vis[v] = 1;
                }
            }
        }
    }
    return true;
}
int n, m;
int main(){
    //freopen("B.1.dat","r+",stdin);
    //freopen("B.1.out","w+",stdout);
    while(scanf("%d %d", &n, &m)){
        if (n + m == 0)
            break;
        init();
        int ok = 0;
        int i;
        char s[4];
        for (i = 1; i <= m; i ++){
            scanf("%s", s);
            add(s[0]-65, s[2]-65);
            topsort1(n);
            if ((int)tmp.size() < n){
                printf("Inconsistency found after %d relations.\n", i);
                ok = 1;
                break;
            }
            if (topsort(n)){
                ok = 1;
                printf("Sorted sequence determined after %d relations: ", i);
                for (int j = 0; j < (int)tsort.size(); j ++){
                    printf("%c", tsort[j]+65);
                }
                puts(".");
                break;
            }
        }
        for (i ++;i <= m; i ++){
            scanf("%s", s);
        }
        if (ok == 0){
            puts("Sorted sequence cannot be determined.");
        }
    }
	return 0;
}
 

转载于:https://www.cnblogs.com/AbandonZHANG/archive/2013/05/16/4114024.html

内容概要:本文详细探讨了基于MATLAB/SIMULINK的多载波无线通信系统仿真及性能分析,重点研究了以OFDM为代表的多载波技术。文章首先介绍了OFDM的基本原理和系统组成,随后通过仿真平台分析了不同调制方式的抗干扰性能、信道估计算法对系统性能的影响以及同步技术的实现与分析。文中提供了详细的MATLAB代码实现,涵盖OFDM系统的基本仿真、信道估计算法比较、同步算法实现和不同调制方式的性能比较。此外,还讨论了信道特征、OFDM关键技术、信道估计、同步技术和系统级仿真架构,并提出了未来的改进方向,如深度学习增强、混合波形设计和硬件加速方案。; 适合人群:具备无线通信基础知识,尤其是对OFDM技术有一定了解的研究人员和技术人员;从事无线通信系统设计与开发的工程师;高校通信工程专业的高年级本科生和研究生。; 使用场景及目标:①理解OFDM系统的工作原理及其在多径信道环境下的性能表现;②掌握MATLAB/SIMULINK在无线通信系统仿真中的应用;③评估不同调制方式、信道估计算法和同步算法的优劣;④为实际OFDM系统的设计和优化提供理论依据和技术支持。; 其他说明:本文不仅提供了详细的理论分析,还附带了大量的MATLAB代码示例,便于读者动手实践。建议读者在学习过程中结合代码进行调试和实验,以加深对OFDM技术的理解。此外,文中还涉及了一些最新的研究方向和技术趋势,如AI增强和毫米波通信,为读者提供了更广阔的视野。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值