suill_ 2024-07-19 08:24 采纳率: 37.5%
浏览 57
已结题

为什么会报错invalid operands of types ‘int’ and ‘const char [2]’ to binary ‘operator<<’?(语言-c++)

为什么我的printf("ss %d %d\n",st[i][0],val[i]);会报错??显示invalid operands of types ‘int’ and ‘const char [2]’ to binary ‘operator<<’?

//kruska找最大生成树(保证所经过权值最大)的最小边
#include<bits/stdc++.h>
using namespace std;
#define N 20100
#define ll long long
struct node
{
    int v,u,w;
}e[N];
struct leaf
{
    int u,v,w; 
}tr[N*2];
int cnt=0,n,m,q;
int h[N],par[N],dis[N];
int dep[N],st[N][20],val[N];//lca
bool cmp(node a,node b)//排序的比较都是bool
{
    return a.w>b.w;
}
void add(int u,int v,int w)
{
    cnt++;
    tr[cnt].v=v;
    tr[cnt].w=w;
    tr[cnt].u=h[u];
    h[u]=cnt;
}
void dfs(int x,int f)
{
    dep[x]=dep[f]+1;
    for(int i=1;1<<i<=dep[x];i++)
        st[x][i]=st[st[x][i-1]][i-1];
    for(int i=h[x];i;i=tr[i].u)//树的边
    {
        int v=tr[i].v;
        if(v!=f)
        {
            val[v]=tr[i].w;
            st[v][0]=x;
            dfs(v,x);
        }
    }
}

int main()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)
        cin>>e[i].u>>e[i].v>>e[i].w;
    cin>>q;
    for(int i=1;i<=n;i++)
    {
        if(find(i)==i)//i为树根
        {
            st[i][0]=i;
            dfs(i,i);//因为可能有多棵树,所以for循环枚举一遍
        }
    }//初始化!!!
    for(int i=1;i<=n;i++)
        printf("ss %d %d\n",st[i][0],val[i]);
    cout<<"\n";
    return 0;
}
  • 写回答

4条回答 默认 最新

  • 阿里嘎多学长 2024-07-19 08:24
    关注

    以下内容由AIGC及阿里嘎多学长共同生成、有用望采纳:


    解决报错问题

    首先,我们来解决你遇到的编译错误。错误信息 invalid operands of types ‘int’ and ‘const char [2]’ to binary ‘operator<<’ 指出在 printf 函数中存在类型不匹配的问题。具体来说,问题出在这行代码:

    printf("ss %d %d\n",st[i][0],val[i]);
    

    这里的问题是 st[i][0] 被错误地传递为 const char [2] 类型。这通常是因为数组类型在传递给 printf 时被错误地解释为字符串。我们需要确保传递的是数组的第一个元素,而不是整个数组。

    修正代码

    为了解决这个问题,你可以将 st[i][0] 改为 st[i][0] 的值,即 *(st[i] + 0)st[i][0] 的地址,即 &(st[i][0])。这里我们选择使用地址的方式,因为 st[i] 是一个指针数组,指向 int 类型的数组。

    修改后的代码如下:

    printf("ss %d %d\n", *(st[i] + 0), val[i]);
    

    理解并优化代码

    dfs 函数

    dfs 函数用于深度优先遍历树,并更新 dep(深度)、st(最近公共祖先的数组)和 val(边的权重)数组。以下是函数的简要说明:

    • dep[x] 存储节点 x 的深度。
    • st[x][i] 存储从根到 x 的第 i 层的节点,用于计算最近公共祖先。
    • val[v] 存储边 v 的权重。

    printf 函数

    printf 函数用于输出数组 stval 的值。你需要确保格式字符串和参数类型匹配。使用 %d 格式化整数。

    调试和测试

    1. 检查 printf 函数的参数:确保 printf 函数中的格式字符串和参数类型匹配。
    2. 理解 dfs 函数:确保 dfs 函数正确地遍历树,并正确地更新 depstval 数组。

    优化代码

    1. 减少不必要的循环:检查代码中是否有可以优化的循环。
    2. 提高代码的可读性:使用更清晰的变量名和添加注释来提高代码的可读性。

    阅读相关文档和资料

    为了更好地理解 C++ 中的类型转换和函数调用,你可以查阅一些相关的文档和资料,例如 C++ 的标准库文档或在线资源。

    最终代码

    以下是修正后的完整代码:

    #include<bits/stdc++.h>
    using namespace std;
    #define N 20100
    #define ll long long
    
    struct node {
        int v, u, w;
    } e[N];
    
    struct leaf {
        int u, v, w;
    } tr[N * 2];
    
    int cnt = 0, n, m, q;
    int h[N], par[N], dis[N];
    int dep[N], st[N][20], val[N]; // lca
    
    bool cmp(node a, node b) {
        return a.w > b.w;
    }
    
    void add(int u, int v, int w) {
        cnt++;
        tr[cnt].v = v;
        tr[cnt].w = w;
        tr[cnt].u = h[u];
        h[u] = cnt;
    }
    
    void dfs(int x, int f) {
        dep[x] = dep[f] + 1;
        for (int i = 1; 1 << i <= dep[x]; i++)
            st[x][i] = st[st[x][i - 1]][i - 1];
        for (int i = h[x]; i; i = tr[i].u) { // 树的边
            int v = tr[i].v;
            if (v != f) {
                val[v] = tr[i].w;
                st[v][0] = x;
                dfs(v, x);
            }
        }
    }
    
    int main() {
        cin >> n >> m;
        for (int i = 1; i <= m; i++)
            cin >> e[i].u >> e[i].v >> e[i].w;
        cin >> q;
        for (int i = 1; i <= n; i++) {
            if (find(i) == i) { // i为树根
                st[i][0] = i;
                dfs(i, i); // 因为可能有多棵树,所以for循环枚举一遍
            }
        }
        for (int i = 1; i <= n; i++)
            printf("ss %d %d\n", *(st[i] + 0), val[i]);
        cout << "\n";
        return 0;
    }
    

    这段代码应该能够正确编译并运行,输出所需的结果。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月26日
  • 创建了问题 7月19日

悬赏问题

  • ¥15 elementui上传结合oss接口断点续传,现在只差停止上传和继续上传,各大精英看下
  • ¥100 单片机hardfaulr
  • ¥20 手机截图相片分辨率降低一半
  • ¥50 求一段sql语句,遇到小难题了,可以50米解决
  • ¥15 速求,对多种商品的购买力优化问题(用遗传算法、枚举法、粒子群算法、模拟退火算法等方法求解)
  • ¥100 速求!商品购买力最优化问题(用遗传算法求解,给出python代码)
  • ¥15 虚拟机检测,可以是封装好的DLL,可付费
  • ¥15 kafka无法正常启动(只启动了一瞬间会然后挂了)
  • ¥15 Workbench中材料库无法更新,如何解决?
  • ¥20 如何推断此服务器配置