【R - 0 or 1】

博客介绍了一道题的解题思路,利用Dijkstra和SPFA找环。将问题看成直接给出邻接矩阵,因是正权图省去麻烦。要找出从1到N的最短路,比较含1的环和含N的环,取较小者为答案,还给出了相关代码。

思路:

  • 真是一道神题。
  • 讲解:mengxiang000000的BLOG
  • Dijkstra,SPFA找环
  • 把它想成直接给出邻接矩阵,因为是正权图,省去了很多麻烦。需要找出从1到N的最短路,含1的环+含N的环,较小的一个即为答案。需要找环也不是很好想,当然,如果连看成邻接矩阵都想得到,这里估计对你也不是问题。

代码:

//670ms			1788kB 


#include <iostream>
#include <algorithm>
#include <queue>
#include <cstring>
#include <cstdio> 
#define INF 0x3f3f3f3f
//如果输入没输入完,会TLE
//如果没给输入多组样例的机会,会WA  

using namespace std;

const int maxn = 305;

int N;
int dis[maxn];
int mp[maxn][maxn];
struct NODE{
	int id;
	int dis;
	NODE(int id,int dis) : id(id) , dis(dis) {} ;
	friend bool operator > (NODE a , NODE b){
		return a.dis > b.dis;
	}
};
priority_queue<NODE , vector<NODE> , greater<NODE> > Q;

int IJK(){
	memset(dis,INF,sizeof(dis));
	Q.push(NODE(1 , 0));dis[1]=0;
	while(Q.size()){
		NODE cur = Q.top();Q.pop();
		if(dis[cur.id] < cur.dis)
			continue;
		for(int i=1;i<=N;i++){
			if(dis[i] > dis[cur.id] + mp[cur.id][i]){
				dis[i] = dis[cur.id] + mp[cur.id][i];
				Q.push(NODE(i , dis[i]));
			}
		}
	}
	return dis[N];
}

queue<int> q;
//2.
//int rec[maxn];//recond times
bool enq[maxn];//en_queue
int SPFA(int U){
	int ans = INF;
	//memset(rec, 0 ,sizeof(rec));
	memset(dis,INF,sizeof(dis));
	memset(enq, 0 ,sizeof(enq));
	q.push(U);dis[U]=0;enq[U]=true;//rec[U]++;
	while(q.size()){
		int cur = q.front() ; q.pop(); enq[cur] = false;//这里容易忘! 
		if(cur != U)
			ans = min(ans , dis[cur] + mp[cur][U]);
		for(int i=1;i<=N;i++){
			if(dis[i] > dis[cur] + mp[cur][i]){
				dis[i] = dis[cur] + mp[cur][i];
				//1.
				if(!enq[i]){
					q.push(i);
					enq[i] = true;
				}
			}
		}
	}
	return ans;
}

int main(){
	while(~scanf("%d",&N)){
		for(int i=1;i<=N;i++)
			for(int j=1;j<=N;j++)
				scanf("%d",&mp[i][j]);
		int ans1 = IJK();
		int ans2 = SPFA(1) + SPFA(N);
		printf("%d\n",min(ans1 , ans2));
	}
	return 0;
}
&lt;think&gt;我们想要调整森林图中OR值的显示范围(特别是将OR的范围限制在0-1),但实际上森林图通常展示的是整个OR范围(0到正无穷)。不过,我们可以通过以下两种方式实现类似效果:方法1:截断置信区间(不推荐,可能误导)-使用`limits`参数强制设置坐标轴范围,但会导致超出范围的置信区间被截断(显示为箭头)方法2:对数变换坐标轴(推荐)-由于OR值天然具有对数尺度,通常森林图使用对数坐标轴-OR&lt;1时,对数变换后对称分布在负无穷到0之间;OR&gt;1时分布在0到正无穷-若想重点展示0-1区间,可以设置坐标轴为对数刻度并限制x轴范围(如0.110),这样0-1区间会被放大显示然而,用户要求&quot;调整OR范围为0-1&quot;,这实际上只展示小于1OR值,大于1的将不可见。这通常不是标准做法,因为会丢失信息。但我们可以通过以下步骤实现:步骤:1.绘制标准森林图(使用对数坐标轴)2.使用`ggplot2::coord_cartesian()`截断x轴范围(如c(0.01,1))注意:截断后OR&gt;1的点将不会显示,因此需要谨慎使用。具体代码实现:```rlibrary(forestmodel)library(ggplot2)#使用之前构建的模型(model)base_plot&lt;-forest_model(model,factor_separate_line=TRUE,exponentiate=TRUE#显示OR值)#调整坐标轴范围:仅显示0-1区间(OR&lt;1)adjusted_plot&lt;-base_plot+coord_cartesian(xlim=c(0.01,1))+#设置OR显示范围(0.011)theme(plot.margin=unit(c(1,1,1,1),&quot;cm&quot;))#调整边距避免标签被截断print(adjusted_plot)```说明:-`xlim=c(0.01,1)`:将x轴(OR值)范围限制在0.011之间-由于使用了对数坐标,0值无法显示(因为log(0)未定义),所以下限取接近0的数(如0.01-超出范围的置信区间会显示为被截断(即线段在边界处停止)重要提醒:这种截断处理会隐藏OR&gt;1的变量(即保护因素),可能导致结果解读偏差。通常建议完整展示整个范围(如c(0.1,10))以保持科学性[^1]。替代方案:如果只想突出显示OR&lt;1的变量,建议使用颜色标记(而非截断):```r#在原始森林图中用红色标记OR&lt;1且显著的变量base_plot+geom_point(data=function(tab)subset(tab,OR&lt;1&amp;p.value&lt;0.05),color=&quot;red&quot;,size=3)```结论:根据分析目的谨慎选择展示方式,避免因可视化操作导致错误结论[^2]。&sect;&sect;相关问题&sect;&sect;1.如何正确解读森林图中被截断的置信区间?2.在Logistic回归中,OR值小于1的变量有什么实际意义?3.除了森林图,还有哪些方法可以可视化多变量回归结果?&lt;/think&gt;### 在R语言中使用forestmodel绘制多变量logistic回归森林图并调整OR范围(0-1) 要实现OR值范围调整为0-1的需求,需要使用对数坐标轴并设置合适的坐标范围。以下是完整解决方案: ```r # 加载必要包 library(forestmodel) library(ggplot2) # 1. 构建多变量logistic回归模型(示例) model &lt;- glm( outcome ~ age + gender + stage, data = your_data, # 替换为你的数据集 family = binomial() ) # 2. 绘制基础森林图 base_plot &lt;- forest_model( model, factor_separate_line = TRUE, # 分类变量分行显示 exponentiate = TRUE, # 显示OR值而非log(OR) panels = default_forest_panels(model, factor_separate_line = TRUE), format_options = forest_model_format_options( colour = &quot;darkblue&quot;, # 线条颜色 shape = 17, # 点形状(三角形) text_size = 3.5 # 文本大小 ) ) # 3. 关键步骤:调整OR显示范围为0-1 # 使用对数坐标轴并设置坐标范围 adjusted_plot &lt;- base_plot + scale_x_log10( # 对数坐标轴 limits = c(0.01, 1), # OR范围0.01-1 breaks = c(0.01, 0.1, 0.5, 1), # 设置刻度点 labels = c(&quot;0.01&quot;, &quot;0.1&quot;, &quot;0.5&quot;, &quot;1.0&quot;) # 刻度标签 ) + geom_vline(xintercept = 1, linetype = &quot;dashed&quot;, color = &quot;red&quot;) + # 参考线 theme_minimal() + labs(title = &quot;多变量Logistic回归结果 (OR范围0-1)&quot;) # 4. 显示图形 print(adjusted_plot) ``` ### 关键参数说明: 1. **`scale_x_log10(limits = c(0.01, 1))`** - 使用对数坐标轴(Logistic回归的标准展示方式) - `limits`参数将OR范围限制在0.01-1之间(0值无法显示,故取0.01) 2. **`breaks`和`labels`** - 自定义坐标轴刻度和标签,使0-1区间的展示更清晰 3. **`geom_vline(xintercept = 1)`** - 添加OR=1的参考线(无效应线),便于结果解读 ### 科学解释: 在logistic回归中,OR值表示暴露组与非暴露组发生结局事件的比值比: $$ OR = \frac{p_1/(1-p_1)}{p_0/(1-p_0)} $$ 其中$p_1$和$p_0$分别表示暴露组和非暴露组的结局发生率[^2]。 当OR &lt; 1时,表示暴露因素是保护因素;OR &gt; 1表示危险因素。将展示范围限制在0-1区间,可以更清晰地观察保护因素的效果[^1]。 ### 注意事项: 1. **分类变量处理**:确保分类变量已转换为因子并正确设置参考水平 ```r your_data$gender &lt;- factor(your_data$gender, levels = c(&quot;Female&quot;, &quot;Male&quot;)) ``` 2. **结果解读**:OR值接近0表示强保护效应,但需结合置信区间和p值判断统计学意义 3. **坐标轴选择**:对数坐标能更直观展示OR值的相对变化,尤其当OR值远离1&gt; 提示:若某些OR值小于0.01,可进步调整`limits`参数下限(如c(0.001, 1)),但需确保结果可读性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值