ZCMU - 2153: D.ly的排队问题

简介: ZCMU - 2153: D.ly的排队问题

题目链接


题目大意:略。

解题思路:Topo排序 + 优先队列

AC 代码

#include<bits/stdc++.h>
#include<cmath>
#define mem(a,b) memset(a,b,sizeof a)
using namespace std;
typedef long long ll;
const int MAXV=1010;
int vis[MAXV];
int mp[MAXV][MAXV]; // 邻接矩阵边连结
int in[MAXV]; // 入度
char rcd[MAXV]; // 最终记录
int n,len; // 顶点个数 最终记录长度
struct node
{
    int top;
    char ch;
};
node nds[MAXV];
struct pq_cmp
{
    bool operator()(node nd1,node nd2)
    {
        return nd1.ch>nd2.ch; // 字母字典序
    }
};
priority_queue<node,vector<node>,pq_cmp> pq;
void init()
{
    mem(vis,0);
    mem(mp,0);
    mem(in,0);
    mem(rcd,'\0');
    len=n=0;
    while(!pq.empty()) pq.pop();
}
int TopoSort()
{
//    int top=-1;
    node ndtop; // 临时变量,类似 top 变量
    ndtop.top=-1;
    for(int i=1;i<=n;i++)
    {
        if(in[i]==0)
        {
//            in[i]=top;
//            top=i;
            in[i]=ndtop.top;
            ndtop.top=i;
            nds[i].top=i;
            pq.push(nds[i]); // 数据加完后再在下面 if语句 取出,下面内层 for_k 当中也同理可得
        }
    }
    if(!pq.empty())
    {
        ndtop=pq.top();
        pq.pop(); // 注意每取一次,pop下
    }
    for(int i=1;i<=n;i++)
    {
        if(ndtop.top==-1)
        {
//            printf("No Answer!");
            return 0;
        }
        else
        {
            int j=ndtop.top;
            ndtop.top=in[j]; // 因为这里的 ndtop 上面保存在 j 里就没用了,所以这里可以替换新的数据
//            printf("%c",crr[j]);
            rcd[len++]=nds[j].ch;
            for(int k=1;k<=n;k++)
            {
                if(mp[j][k] && --in[k]==0)
                {
//                  in[k]=top;
//                  top=k;
                    in[k]=ndtop.top;
                    ndtop.top=k;
                    nds[k].top=k;
                    pq.push(nds[k]);
                }
            }
            if(!pq.empty())
            {
                ndtop=pq.top();
                pq.pop();
            }
        }
    }
    return 1;
}
int main()
{
    init();
    string s;
    while(cin>>s) // while(~scanf("%c>%c",&c1,&c2)) 多组数据时,没办法 Ctrl+Z
    {
        int from=s[0]-'A',to=s[2]-'A';
        if(vis[from]==0)
        {
            nds[++n].ch=s[0];
            vis[from]=n;
            from=n;
        }
        else
        {
            from=vis[from];
//            in[from]++; // 因为from指向to,所以并不是from的入度++
        }
        if(vis[to]==0)
        {
            nds[++n].ch=s[2];
            vis[to]=n;
            in[n]++;
            to=n;
        }
        else
        {
            to=vis[to];
            // 避免重复导致 in[to]++,一般情况topo题型很喜欢有重复数据
            if(mp[from][to]==1) continue;
            in[to]++;
        }
        mp[from][to]=1;
    }
    if(TopoSort())
    {
        for(int i=0;i<len;i++)
            printf("%c",rcd[i]);
    }
    else
        printf("No Answer!");
    puts("");
}
目录
相关文章
|
6月前
|
资源调度 分布式计算 安全
YARN的FIFO调度器和Capacity Scheduler调度器在资源分配上有何区别?
【6月更文挑战第20天】YARN的FIFO调度器和Capacity Scheduler调度器在资源分配上有何区别?
84 11
|
6月前
|
资源调度 分布式计算 安全
FIFO调度器和Capacity Scheduler调度器各自有哪些特点?
【6月更文挑战第20天】FIFO调度器和Capacity Scheduler调度器各自有哪些特点?
64 7
|
Java 调度
@Scheduled阻塞导致未执行生效
@Scheduled阻塞导致未执行生效
167 0
ScheduledExecutorService出现异常挂掉的问题
ScheduledExecutorService出现异常挂掉的问题
567 0
|
调度
解决使用@Scheduled创建任务时无法在同一时间执行多个任务的BUG
解决使用@Scheduled创建任务时无法在同一时间执行多个任务的BUG
187 0
|
调度
Quartz的Scheduler的关闭和挂起,并发控制(四)上
Quartz的Scheduler的关闭和挂起,并发控制(四)上
473 0
Quartz的Scheduler的关闭和挂起,并发控制(四)上
|
调度 数据库
Quartz的Scheduler的关闭和挂起,并发控制(四)中
Quartz的Scheduler的关闭和挂起,并发控制(四)中
1765 0
Quartz的Scheduler的关闭和挂起,并发控制(四)中
Quartz的Scheduler的关闭和挂起,并发控制(四)下
Quartz的Scheduler的关闭和挂起,并发控制(四)下
488 0
Quartz的Scheduler的关闭和挂起,并发控制(四)下
|
监控 Java
进程池&线程池(更新ing)
核心思想:一池子管理子进程or线程(在服务器处于负载高峰期可以增加服务池大小,以适应新的客户端请求),减少CPU资源浪费在创建和销毁进程/线程的时间。
159 0
|
资源调度 分布式计算 Cloud Native
Schedulerx2.0支持可抢占的任务优先级队列
1. 前言 Schedulerx2.0是一套分布式的任务调度+计算框架。作为一套分布式计算引擎,用户经常需要资源管理的需求,当前schedulerx仅仅支持单个任务实例的管控(比如单机子任务并发数、拉模型全局子任务并发数等),这一点是远远不够的。
3478 0
Schedulerx2.0支持可抢占的任务优先级队列