HDU 1811 Rank of Tetris

本文介绍了一种使用并查集和拓扑排序解决特定类型问题的方法。通过合并相等元素并进行拓扑排序来判断解的唯一性和可行性。文章提供了完整的C++代码实现,展示了如何处理元素间的关系并最终得出结论。

 

之前写了没调,今天捏了一个小样例就过了,卒

今天苟完了粗糙的推箱子大作业,太丑陋了,但是认真敲代码的感觉真好

不能再赖床了,要认真学习

 

是一go并查集+拓扑排序,有俩处理:

1.等于的把他们合并在一起变成一个

2.最后拓扑排序的时候,如果队列里有大于一个元素,说明排列不唯一

 

 

 

 

题目

#include<iostream>
#include<stdio.h>
#include<queue>
#include<string.h>

using namespace std;
char s[10];
int head[10005];

struct edge{
    int v,next;
}e[20005];
int ind[10005],fa[10005],sum[10005];
int tot;
queue<int>q;

void addedge(int u, int v){
    e[++tot]=(edge){v,head[u]};
    head[u]=tot;
}

int getfa(int x){
    return fa[x]==x?x:fa[x]=getfa(fa[x]);
}

void unit(int x, int y){
    int xx=getfa(x);
    int yy=getfa(y);
    if (xx==yy)return;
    fa[xx]=yy;
    sum[yy]+=sum[xx];
    for (int i=head[xx];i!=-1;i=e[i].next){
        addedge(yy,getfa(e[i].v));
    }
}

int main(){

    int n,m,x,y;
    while (~scanf("%d%d",&n,&m)){

        memset(head,-1,sizeof(head));
        memset(ind,0,sizeof(ind));

        tot=0;
        for (int i=0;i<n;i++){
            fa[i]=i;
            sum[i]=1;
        }

        for (int i=1;i<=m;i++){
            cin>>x>>s>>y;
            if (s[0]=='>') addedge(getfa(x),getfa(y));
            else if (s[0]=='=') unit(x,y);
            else addedge(getfa(y),getfa(x));
        }

        for (int i=0;i<n;i++){
            if (fa[i]!=i) continue;
            for (int j=head[i];j!=-1;j=e[j].next){
                ind[getfa(e[j].v)]++;
            }
        }

/*
        for (int i=0;i<n;i++) cout<<ind[i]<<" ";
        cout<<endl;
        for (int i=0;i<n;i++) cout<<fa[i]<<" ";
        cout<<endl;
        cout<<sum[0]<<endl;
*/
        int qsum=0;

        for (int i=0;i<n;i++){
            if (fa[i]==i&&ind[i]==0) q.push(i);
        }

        int ans=0;
        while(!q.empty()){
            if (q.size()>1) ans=1;
            int u=q.front();
            //cout<<"u="<<u<<"  sum="<<qsum<<endl; 
            q.pop();
            qsum+=sum[u];
            for (int i=head[u];i!=-1;i=e[i].next){
                int v=getfa(e[i].v);
                ind[v]--;
                if (!ind[v]){
              //      cout<<"fa[v]="<<fa[v]<<" v="<<v<<endl;
                    q.push(v);
                }
            }
        }
        if (qsum<n) cout<<"CONFLICT"<<endl;
        else if (ans==1) cout<<"UNCERTAIN"<<endl;
        else cout<<"OK"<<endl;
    }
}


/*


5 4
0 = 1
2 > 1
3 < 1
4 < 1




*/

 

个人防护装备实例分割数据集 一、基础信息 • 数据集名称:个人防护装备实例分割数据集 • 图片数量: 训练集:4524张图片 • 训练集:4524张图片 • 分类类别: 手套(Gloves) 头盔(Helmet) 未戴手套(No-Gloves) 未戴头盔(No-Helmet) 未穿鞋(No-Shoes) 未穿背心(No-Vest) 鞋子(Shoes) 背心(Vest) • 手套(Gloves) • 头盔(Helmet) • 未戴手套(No-Gloves) • 未戴头盔(No-Helmet) • 未穿鞋(No-Shoes) • 未穿背心(No-Vest) • 鞋子(Shoes) • 背心(Vest) • 标注格式:YOLO格式,适用于实例分割任务,包含边界框或多边形坐标。 • 数据格式:图片数据,来源于监控或相关场景。 二、适用场景 • 工业安全监控系统开发:用于自动检测工人是否佩戴必要的个人防护装备,提升工作场所安全性,减少工伤风险。 • 智能安防应用:集成到监控系统中,实时分析视频流,识别PPE穿戴状态,辅助安全预警。 • 合规性自动化检查:在建筑、制造等行业,自动检查个人防护装备穿戴合规性,支持企业安全审计。 • 计算机视觉研究:支持实例分割、目标检测等算法在安全领域的创新研究,促进AI模型优化。 三、数据集优势 • 类别全面:覆盖8种常见个人防护装备及其缺失状态,提供丰富的检测场景,确保模型能处理各种实际情况。 • 标注精准:采用YOLO格式,每个实例都经过精细标注,边界框或多边形坐标准确,提升模型训练质量。 • 真实场景数据:数据来源于实际环境,增强模型在真实世界中的泛化能力和实用性。 • 兼容性强:YOLO格式便于与主流深度学习框架(如YOLO、PyTorch等)集成,支持快速部署和实验。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值