2018 UESTC Training for Graph Theory

E - 北极的猴子

给出n个点,m条边的带权无向图,问从点s到点t,删除至多两条边,是否能够使得点s到点t不连通,即无法双向来回,求最小花费。cf原题 先用dfs找到从s到t的任意一条路径,因为要删的1条或两条边,一定在这条路径上,否则一定会连通的,然后枚举这条路径上的每一条边,即这是要删除的第一条边,跑一次tarjan找到在删除这一条边的情况下的所有的桥(删掉桥是能将图分成两个或多个子图),然后在判断一次连通(这里用另一个数组去存放第二次跑的任意一条从s到t的路径,而且是在删除第一条边的情况下),如果已经不连通了,就可以直接取值了,如果还是连通,那么就要在删除这一条边的情况下,判断上面所说的另一个数组中的所有路径是否存在桥,如果存在,那么第一条删的边+这个桥就是一个可行解,遍历所有桥,就可以得出答案了。这里要注意,在tarjan里面找桥的算法要判重边,下面代码是将无向边拆分成两个有向边,所以你从u->v,pre=u,然后一定会有一条边是可以从v->u的,所以这就是原来的边,flag的作用就是排除自身的有向边,找出其它的重边。

找桥的条件  Low[v]>DFN[u]  下面是bi哥的cf代码...读了好久才懂

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1005;
const int MAXM=30005*2;
struct Edge
{
    int to,next,va,f;
}edge[MAXM];
int head[MAXN],tot=0;
int Low[MAXN],DFN[MAXN],vis[MAXN]={0},bridge[MAXM]={0};
int Index=0,n,m,s,t,a,b,c;
void addedge(int u,int v,int c)
{
    edge[tot].to=v;edge[tot].next=head[u];edge[tot].va=c;
    edge[tot].f=u;
    head[u]=tot++;
}
bool dfs(int u,int fa,int del,vector<int> &path)
{
	vis[u]=1;
	if(u==t)
	{
		return true;
	}
	for(int i=head[u];~i;i=edge[i].next)
	{
		int v=edge[i].to;
		if(v==fa||(i>>1)==del)
		{
			continue;
		}
		if(!vis[v]&&dfs(v,u,del,path))
		{
			path.push_back(i>>1);
			return true;
		}
	}
	return false;
}
void Tarjan(int u,int fa,int del){
    DFN[u]=Low[u]=++Index;
    int flag=0;
    for(int i=head[u];i!=-1;i=edge[i].next){
        int v=edge[i].to;
        if((i>>1)==del) continue;
        if(v==fa&&!flag){
            flag=1;
            continue;
        }
        if(!DFN[v]){
            Tarjan(v,u,del);
            if(Low[u]>Low[v])Low[u]=Low[v];
            if(Low[v]>DFN[u]) bridge[i>>1]=1;
        }
        else Low[u]=min(DFN[v],Low[u]);
    }
}
void init()
{
	memset(DFN,0,sizeof(DFN));
	memset(vis,0,sizeof(vis));
	memset(bridge,0,sizeof(bridge));
	Index=0;
}
int main()
{
	memset(head,-1,sizeof(head));
	memset(vis,0,sizeof(vis));
	scanf("%d%d",&n,&m);
	scanf("%d%d",&s,&t);
	for(int i=0;i<m;i++)
	{
		scanf("%d%d%d",&a,&b,&c);
		addedge(a,b,c);
		addedge(b,a,c);
	}
	vector<int> path;
	if(!dfs(s,-1,-1,path))
	{
		printf("0\n0\n");
	}
	else
	{
		int ans=2e9+5;
		vector<int> ret;
		for(int i=0;i<path.size();i++)
		{
			init();
			for(int j=1;j<=n;j++)
			{
				if(!DFN[j])
				{
					Tarjan(j,-1,path[i]);
				}
			}
			vector<int> tmp;
			if(!dfs(s,-1,path[i],tmp))
			{
				if(ans>edge[path[i]*2].va)
				{
					ans=edge[path[i]*2].va;
					ret.clear();
					ret.push_back(path[i]+1);
				}
			}
			else
			{
				for(int j=0;j<tmp.size();j++)
				{
					if(bridge[tmp[j]])
					{
                        if(ans>edge[path[i]*2].va+edge[tmp[j]*2].va)
						{
                            ans=edge[path[i]*2].va+edge[tmp[j]*2].va;
                            ret.clear();
                            ret.push_back(path[i]+1);
                            ret.push_back(tmp[j]+1);
                		}
					}
				}
			}
		}
		if(ans>2e9) cout<<-1<<endl;
		else
		{
			cout<<ans<<endl<<ret.size()<<endl;
			for(int i=0;i<ret.size();i++)
			{
				printf("%d",ret[i]);
				if(i==ret.size()-1)
					cout<<endl;
				else
					cout<<" ";
			}
		}
	}
}

资源下载链接为: https://pan.quark.cn/s/5c50e6120579 在Android移动应用开发中,定位功能扮演着极为关键的角色,尤其是在提供导航、本地搜索等服务时,它能够帮助应用获取用户的位置信息。以“baiduGPS.rar”为例,这是一个基于百度地图API实现定位功能的示例项目,旨在展示如何在Android应用中集成百度地图的GPS定位服务。以下是对该技术的详细阐述。 百度地图API简介 百度地图API是由百度提供的一系列开放接口,开发者可以利用这些接口将百度地图的功能集成到自己的应用中,涵盖地图展示、定位、路径规划等多个方面。借助它,开发者能够开发出满足不同业务需求的定制化地图应用。 Android定位方式 Android系统支持多种定位方式,包括GPS(全球定位系统)和网络定位(通过Wi-Fi及移动网络)。开发者可以根据应用的具体需求选择合适的定位方法。在本示例中,主要采用GPS实现高精度定位。 权限声明 在Android应用中使用定位功能前,必须在Manifest.xml文件中声明相关权限。例如,添加<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />,以获取用户的精确位置信息。 百度地图SDK初始化 集成百度地图API时,需要在应用启动时初始化地图SDK。通常在Application类或Activity的onCreate()方法中调用BMapManager.init(),并设置回调监听器以处理初始化结果。 MapView的创建 在布局文件中添加MapView组件,它是地图显示的基础。通过设置其属性(如mapType、zoomLevel等),可以控制地图的显示效果。 定位服务的管理 使用百度地图API的LocationClient类来管理定位服务
资源下载链接为: https://pan.quark.cn/s/dab15056c6a5 Oracle Instant Client是一款轻量级的Oracle数据库连接工具,能够在不安装完整Oracle客户端软件的情况下,为用户提供访问Oracle数据库的能力。以“instantclient-basic-nt-12.1.0.1.0.zip”为例,它是针对Windows(NT)平台的Instant Client基本版本,版本号为12.1.0.1.0,包含连接Oracle数据库所需的基本组件。 Oracle Instant Client主要面向开发人员和系统管理员,适用于数据库查询、应用程序调试、数据迁移等工作。它支持运行SQL*Plus、PL/SQL Developer等管理工具,还能作为ODBC和JDBC驱动的基础,让非Oracle应用连接到Oracle数据库。 安装并解压“instantclient_12_1”后,为了使PL/SQL Developer等应用程序能够使用该客户端,需要进行环境变量配置。设置ORACLE_HOME指向Instant Client的安装目录,如“C:\instantclient_12_1”。添加TNS_ADMIN环境变量,用于存放网络配置文件(如tnsnames.ora)。将Instant Client的bin目录添加到PATH环境变量中,以便系统能够找到oci.dll等关键动态链接库。 oci.dll是OCI(Oracle Call Interface)库的重要组成部分。OCI是Oracle提供的C语言接口,允许开发者直接与数据库交互,执行SQL语句、处理结果集和管理事务等功能。确保系统能够找到oci.dll是连接数据库的关键。 tnsnames.ora是Oracle的网络配置文件,用于定义数据库服务名与网络连接参数的映射关系,包括服务器地址
## 1. 概述 `SpineManager` 是用于管理 Spine 动画实例的核心单例类,主要负责 Spine 动画的对象池管理、分组轮转更新、LOD(细节层次)控制,确保性能与资源使用最优化。 `SpineManagerExtend` 作为其业务逻辑扩展,封装常用的实例生成和回收方法,避免主管理类与游戏业务逻辑耦合。 `SpineManagerLODConfig` 是通过 ScriptableObject 配置的参数文件,方便设计师在编辑器中调节 Spine 动画的 LOD 距离阈值、更新频率和分区数量。 --- ## 2. SpineManager 核心功能 ### 2.1 单例设计 - 真单例实现,避免静态构造顺序带来的隐患。 - 全局唯一 Spine 管理实例,支持任意时机调用。 ### 2.2 对象池管理 - 每个 `SkeletonDataAsset` 资源路径对应一个 Spine 实例对象池。 - 实例租赁时优先复用,避免频繁销毁创建。 - 实例回收后自动隐藏并挂入管理隐藏节点,停止更新。 ### 2.3 分组轮转更新机制 - 所有激活 Spine 实例被划分为 `groupCount` 个分区。 - 每帧仅更新当前轮转分区,分散性能压力。 - 支持动态注册与注销 Spine 代理。 ### 2.4 LOD 细节层次控制 - 自动计算摄像机与实例距离,选择适当更新频率: - 高精度(近距离):高频更新。 - 中精度(中距离):中频更新。 - 低精度(远距离):低频更新。 - 更新频率及距离阈值由 `SpineManagerLODConfig` 决定。 ### 2.5 注册与注销机制 - 实例激活时自动加入负载最少的分区。 - 回收时从对应分区中移除并归还对象池。 ### 2.6 每帧更新流程 - `SpineM
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值