hud 3062 Party

2-SAT算法详解及应用
本文详细介绍了2-SAT算法的基本概念、思路和实践应用,通过实例代码演示了如何解决2-SAT问题,并深入探讨了算法的时间复杂度和优化策略。

题意:中文的,不解释了

思路:2-sat基本题,练习的第一道题目,网上找了个模板

话说这个vector< vector<int> >还真是弄了好久的,所以先

写了一个一维的弄了好久好久……2-sat终于有点思路了,各种错啊……

这个是一维的:

#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include <cstdio>
#include<algorithm>
#include <cstring>
using namespace std;

const int N=2005;

vector<int>map1[N];
vector<int>map2[N];

bool used[N],flag[N][N];

int order[N],id[N];
int m,n,cnt,color;

void Init()
{
for(int i=0;i<2*n;i++)
{
map1[i].clear();
map2[i].clear();
}
}

void addedge(int from,int to)
{
map1[from].push_back(to);
map2[to].push_back(from);
}

void build_map1()
{
int i,x,y,u,v,uu,vv;
for(i=0;i<m;i++)
{
scanf("%d%d%d%d",&x,&y,&u,&v);
u=2*x+u;
uu=(u%2)?u-1:u+1;
v=2*y+v;
vv=(v%2)?v-1:v+1;
addedge(u,vv);
addedge(v,uu);
}
}

void dfs1(int u) //把所有的点正向压缩
{
used[u]=true;
for(int i=0;i<map1[u].size();i++)
if(!used[map1[u][i]])
dfs1(map1[u][i]);
order[cnt++]=u;
}

void dfs2(int u)
{
used[u]=true;
id[u]=color;
for(int i=0;i<map2[u].size();i++)
if(!used[map2[u][i]])
dfs2(map2[u][i]);
}

bool sat()
{
int i;
memset(used,0,sizeof(used));
color=cnt=0;
for(i=0;i<2*n;i++)
if(!used[i])
dfs1(i);
memset(used,0,sizeof(used));
for(i=cnt-1;i>=0;i--)
if(!used[order[i]])
{
color++;
dfs2(order[i]);
}
for(i=0;i<2*n;i+=2)
if(id[i]==id[i+1])
return 0;
return 1;
}


int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0&&m==0)
break;
Init();
build_map1();
if(!sat())
printf("NO\n");
else
printf("YES\n");
}
return 0;
}

 

/*
这个是二维的:

*/

#include <iostream>
#include <queue>
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
const int Maxn=2010;//2*N
bool visit[Maxn];//标记
vector< vector<int> > adj;//正向图
vector< vector<int> > radj;//逆向图
int n,m,cnt,id[Maxn],order[Maxn];
//n表示点对数,m表示矛盾,id[]表示缩点后点对应的新点的标号
//order[]是强连通时使用korasaju记录搜索的次序
void Init()
{
for(int i=0; i<2*n; i++)
{
adj[i].resize(Maxn);
radj[i].resize(Maxn);
}
}
void init()
{
for(int i=0; i<2*n; i++)
{
adj[i].clear();
radj[i].clear();
}
}

void AddEdge(int from, int to)
{
adj[from].push_back(to);
radj[to].push_back(from);
}

void BuildGraph()
{
int u, v, x, y;
for(int i=0; i<m; i++)
{
scanf("%d%d%d%d", &x, &y, &u, &v);
u=2*x+u;
int uu=(u%2)?u-1:u+1;
v=2*y+v;
int vv=(v%2)?v-1:v+1;
AddEdge(u, vv);
AddEdge(v, uu);
}
}
void dfs(int u)//求强联通时的正向搜索进行标号
{
visit[u]=true;
int i,len=adj[u].size();
for(i=0; i<len; i++)
if(!visit[adj[u][i]])
dfs(adj[u][i]);
order[cnt++]=u;//标号从0开始,上面的点后标号,表示从正向的边存在
}

void rdfs(int u)//求强联通的逆向搜索
{
id[u]=cnt;//进行缩点标记
visit[u]=true;
int i,len=radj[u].size();
for(i=0; i<len; i++)
if(!visit[radj[u][i]])
rdfs(radj[u][i]);
}

void korasaju()
{
int i;
memset(visit,false,sizeof(visit));
for(cnt=0,i=0; i<2*n; i++) //正向搜一次
if(!visit[i])
dfs(i);
memset(id,0,sizeof(id));
memset(visit,false,sizeof(visit));
for(cnt=0,i=2*n-1; i>=0; i--) //从正向标记大的逆向搜一次.表示逆向的边也存在
{
if(!visit[order[i]])
{
cnt++;
rdfs(order[i]);//缩点后点的标号从1开始
}
}
}

bool solve()//判断同样的缩点中是否有矛盾的点
{
for(int i=0; i<2*n; i+=2)
if(id[i]==id[i+1])
return false;
return true;
}

int main()
{
adj.resize(Maxn);
radj.resize(Maxn);
Init();
while(scanf("%d%d", &n, &m)!=EOF)
{
init();
BuildGraph();
korasaju();
if(!solve()) puts("NO");
else puts("YES");
}
return 0;
}

 

转载于:https://www.cnblogs.com/FreeAquar/archive/2011/07/12/2104207.html

请使用cesium@1.107之后的版本提供的构造函数和API。全局安装@vue/cli,vue3创建cesium+three.js深度融合的项目,项目名称为vue-cesium,选择babel、vue-router、vuex、scss、Linter/F和vue3,其他的默认。删除views目录下的所有js文件和components目录下的文件,在views目录下新建CesiumView.vue文件,修改App.vue和router目录下的main.js文件,将router目录下的index.js文件里的路由器模型设置为hash模型。安装cesium和three,修改vue.config.js,在vue.config.js里添加const CesiumSourc = "node_modules/cesium/Source",添加const=CesiumWorker="../Build/Cesium/Workers",把CesiumSourc路径下的Assets、ThirdParty、Widgets复制到dist目录下。把CesiumSource路径下的CesiumWorker复制到dist目录下,把public目录下的models复制到dist目录下。在CesiumView.vue里添加 import * as Cesium from "cesium/Cesium";、 import * as THREE from "three"; 、import "cesium/Widgets/widgets.css,使用最新版本提供的构造函数或api编写代码,在CesiumView.vue中添加const czml = [ { id: "document", name: "CZML Model", version: "1.0", clock: { interval: "2025-08-07T09:30:00Z/2025-08-10T09:30:00Z", currentTime: "2025-08-07T09:30:00Z", multiplier: 1, range: "LOOP_STOP", step: "SYSTEM_CLOCK_MULTIPLIER" } }, { id: "aircraftModel", name: "Cesium Air", position: { epoch: "2025-08-07T09:30:00Z", cartographicDegrees: [ 0, 113.60194, 23.525223, 520, 1200, 113.578067, 23.541241, 1200, 2500, 113.487823, 23.594139, 2500 ], }, model: { gltf: "models/CesiumAir/Cesium_Air.glb", minimumPixelSize: 128, maximumScale: 200, }, }, ];,dataSource加载czml并监听czml获取czml模型的位置和自动调整czml模型的方向,创建particleCount数量为5000个的粒子系统,建立float32Array()缓冲区存储记录每个粒子的位置、大小、颜色、速度、随机值,使用glsl着色器渲染粒子冒烟着火的特效,把粒子系统的三维坐标转换成cesium的三维坐标添加到czml模型上显示出来。注意,此项目不添加额外的ui控制和ui显示。
08-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值