50 years, 50 colors

这个题是最小点覆盖

根据定理也就是求二分图的最大匹配(证明没看懂)

就是我们把行拿出来作为左部分,列拿出来作为右部分,然后两者相连的边就代表了原图中的点

#include<iostream>
#include<cstdio>
#include<map>
#include<string.h>
using namespace std;
int un,uv;
map<int,int>m;
const int maxn = 100+10;
int g[maxn][maxn];
int linker[maxn];
int used[maxn];
int n,k;
int res[100];
bool dfs(int u,int t){
    for(int v = 0;v<uv;++v){
        if(g[u][v]==t&&!used[v]){
            used[v] = true;
            if(linker[v]==-1||dfs(linker[v],t)){
            linker[v] = u;
            return true;}
        }
    }
    return false;
}

int hungry(int t){
    int res = 0;
    memset(linker,-1,sizeof(linker));
    for(int u =0;u<un;++u){
        memset(used,false,sizeof(used));
        if(dfs(u,t))res++;
    }
    return res;
}
int main(){
    while(~scanf("%d%d",&n,&k)&&n+k!=0){
            m.clear();
            un = n,uv= n;
        for(int i = 0;i<n;++i){
            for(int j =0;j<n;++j){
                scanf("%d",&g[i][j]);
                m[g[i][j]]=1;
            }
        }

        int h = 0;
        map<int,int>::iterator it;
        for(it = m.begin();it!=m.end();++it){
            if(hungry(it->first)>k){
                res[h++]=it->first;
            }
        }
        if(h==0)
            cout<<-1<<endl;
        else{
                for(int i =0;i<h;++i){
                    if(i)
                        cout<<" "<<res[i];
                    else
                        cout<<res[i];
                }
                cout<<endl;
            }

    }

}

 

<think>好的,我现在需要帮助用户解决一个关于R语言绘图的问题。用户提供了他们的数据结构和代码,想要用plotrix包绘制堆叠柱状图,并且将netGHG作为散点图叠加在同一图上。同时,他们要求柱状图中间白色、两侧对称渐变,不同图例用不同的渐变色区分,横坐标是2004到2022年。 首先,我需要理解用户的数据结构。用户的数据框data是从mydataexcel1中提取的,包含years、rice、rice1、wheat、wheat1和netGHG列。然后使用pivot_longer将四个作物相关的列转换成长格式,得到data_long,其中Type是分类变量,Value是数值。 接下来,用户的需求是绘制堆叠柱状图,并且每个Type的图例有不同的渐变颜色。中间的柱状部分白色,两侧对称渐变。同时,netGHG作为散点图叠加在柱状图上,横坐标是2004-2022年。 我需要考虑如何用plotrix包实现这个效果。plotrix中的stackpoly函数适合绘制堆叠柱状图,但颜色渐变可能需要自定义。用户提到中间白色,两侧渐变,这可能是指每个堆叠条的中间部分为白色,左右两侧颜色渐变。例如,对于rice和rice1,可能需要两种不同的渐变色,同样适用于wheat和wheat1。 首先,我需要确定每个Type对应的颜色方案。假设用户有四个Type:rice, rice1, wheat, wheat1。需要为每个Type创建渐变色,中间是白色,向两侧渐变。例如,rice可能从深绿到白再到深绿,而rice1可能是另一种颜色的渐变,比如蓝色。同样处理wheat和wheat1。 然后,stackpoly函数需要x和y的矩阵形式。用户的数据是长格式,需要转换为宽格式,按照years排序,每个Type的值排列成矩阵的列。可能需要调整数据排列,确保每个年份的各个Type的值正确对应。 接下来,处理颜色。每个Type需要生成渐变色,比如使用colorRampPalette创建从深色到白色再到深色的渐变,对称分布。然后,将这些颜色分配给对应的堆叠部分。 然后,叠加散点图。netGHG的数据在原始data中,需要将每年的netGHG值作为点添加到同一图上。可能需要调整散点图的位置,使其在柱状图上方正确显示,可能需要左右微调位置以避免重叠,或者根据柱状图的宽度调整x坐标。 横坐标需要显示2004到2022年,确保所有年份都正确显示,可能需要检查数据中是否包含这些年份,或者是否需要进行插值处理。 可能遇到的问题包括颜色渐变的生成是否正确,堆叠顺序是否正确,散点图的位置是否正确,以及坐标轴标签和图例的显示是否清晰。 接下来,我需要编写示例代码,确保数据转换正确,颜色生成正确,堆叠图与散点图正确叠加,并添加详细的注释,让用户能够理解每一步的作用。同时,需要测试代码是否存在语法错误,比如括号是否匹配,包是否正确加载,列名是否正确引用。 最后,检查是否满足所有用户需求:颜色渐变区分不同图例,中间白色,两侧对称,散点图叠加,横坐标正确,代码完整可运行,注释详细。</think>以下是根据您的要求编写的R代码及详细注释: ```r # 加载必要的包 library(plotrix) # 用于绘制堆叠柱状图 library(tidyverse) # 用于数据操作 library(RColorBrewer) # 生成渐变色 # 生成示例数据(假设mydataexcel1已存在) # 注意:实际使用时请用真实数据替换这段生成代码 data <- data.frame( years = 2004:2022, rice = runif(19, 5, 15), rice1 = runif(19, 3, 12), netGHG = runif(19, -10, 10), wheat = runif(19, 8, 18), wheat1 = runif(19, 6, 14) ) # 转换数据为长格式 data_long <- data %>% pivot_longer( cols = c(rice, rice1, wheat, wheat1), names_to = "Type", values_to = "Value" ) # 准备绘图参数 ----------------------------------------------------------- # 创建颜色渐变函数(示例使用蓝-白-红渐变) create_gradient <- function(n, main_color) { colorRampPalette(c(main_color, "white", main_color))(n) } # 为每个类型创建渐变色 types <- unique(data_long$Type) n_colors <- 50 # 每个渐变包含的颜色数量 # 定义主色(可根据需要修改) colors_list <- list( rice = "#1b9e77", # 绿色系 rice1 = "#d95f02", # 橙色系 wheat = "#7570b3", # 紫色系 wheat1 = "#e7298a" # 粉色系 ) # 生成渐变颜色矩阵 grad_colors <- matrix(nrow = n_colors, ncol = length(types)) for (i in seq_along(types)) { grad_colors[, i] <- create_gradient(n_colors, colors_list[[types[i]]]) } # 准备堆叠数据矩阵 stack_matrix <- data_long %>% pivot_wider(names_from = Type, values_from = Value) %>% select(-netGHG) %>% as.matrix() # 绘制图形 --------------------------------------------------------------- # 设置绘图参数 par(mar = c(5, 4, 4, 8)) # 调整右边距给图例留空间 # 创建基础堆叠柱状图 stackpoly(stack_matrix[, -1], stack = TRUE, col = grad_colors, xaxlab = data$years, xlab = "Year", ylab = "Crop Value", main = "Stacked Bar Chart with GHG Emissions", axis4 = FALSE) # 关闭右边坐标轴 # 添加净温室气体排放散点图 # 调整x坐标位置使其与柱状图对齐 x_positions <- seq_along(data$years) + 0.5 points(x = x_positions, y = data$netGHG, pch = 21, bg = "yellow", col = "black", cex = 1.2) # 添加图例 legend("topright", inset = c(-0.25, 0), # 调整图例位置 xpd = TRUE, # 允许在绘图区外绘制 legend = c(types, "Net GHG"), fill = c(sapply(colors_list, "[", 1), NA), border = NA, pch = c(rep(NA, 4), 21), pt.bg = c(rep(NA, 4), "yellow"), pt.cex = 1.5, title = "Legend") # 添加右侧坐标轴(净温室气体排放) axis(4, at = pretty(range(data$netGHG)), col.axis = "darkred") mtext("Net GHG Emissions", side = 4, line = 2.5, col = "darkred") ``` **代码说明:** 1. **数据准备部分:** - 使用`pivot_longer`将数据转换为长格式,适合绘图 - 创建示例数据(实际使用时需替换为真实数据) 2. **颜色设置:** - 使用`colorRampPalette`创建对称渐变 - 为每个作物类型定义主色调 - 生成包含50个颜色的渐变矩阵 3. **图形绘制:** - `stackpoly`函数绘制堆叠柱状图 - `grad_colors`矩阵确保每个堆叠条都有独立渐变色 - 调整坐标轴边距给图例留出空间 4. **散点图叠加:** - 使用`points`添加净温室气体排放数据 - 调整x坐标位置与柱状图对齐 5. **图例与坐标轴:** - 自定义图例包含散点图符号 - 右侧添加红色坐标轴表示温室气体排放 **注意事项:** 1. 实际使用时需要确保安装并加载了所有依赖包 2. 颜色方案可以根据需要修改`colors_list`中的色值 3. 可以通过调整`n_colors`改变渐变平滑度 4. 散点图的y轴范围可能需要根据实际数据调整 5. 如果年份不连续,需要先补全缺失年份数据 最终效果将得到: - 堆叠柱状图每个条带都有独立渐变色 - 净温室气体排放以黄色散点叠加显示 - 双y轴显示不同量纲数据 - 专业排版的可视化图形
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值