c++ 在节点之间传递值,使每个节点都具有相同的值[已关闭]

flmtquvp  于 2022-12-20  发布在  其他
关注(0)|答案(1)|浏览(115)

这个问题是由打字错误或无法再重现的问题引起的。虽然类似的问题在这里可能是on-topic,但这个问题的解决方式不太可能帮助未来的读者。
2天前关闭。
Improve this question
我正在努力解决这个问题:
给定 * N * 个节点和 * E * 条边,每条边连接 * u * 和 * v *。每个节点处都有一个整数值。如果有一条边连接 * x * 和 * y *,则可以将整数值从 * x * 传递到 * y *。从 * x * 传递到 * y * 的值最多为 * x * 处的值。找出使每个节点具有相同值所需的最小传输数,并找到实现此目的的方法。
输入格式有 * T * 个子测试。对于每个子测试,第一行包含 * N * 和 * E *。接下来的 * E-1 * 行包含 * u * 和 * v *,表示有一条边连接 * u * 和 * v *。最后一行包含 * N * 个整数,它们是从 * 1 * 到 * N * 的每个节点的值。注意 * E N *。
输出的格式第一行是 * A *,最小传输次数,接下来的 * A * 行包含3个整数 * x,y和z *,表示x值从节点y传输到z。
这是目前为止我编写的c++代码

#include <bits/stdc++.h>
using namespace std;

typedef pair<int, int> PII;
const int N=200014;
int n, e, fv=0;
vector<int> s[N];
int v[N];
vector<pair<PII, int> > ans;
queue<int> q;

void pq(queue<int> qq)
{
    while (qq.size())
    {
        cout<<qq.front()<<' ';
        qq.pop();
    }
    cout<<endl;
}

int main()
{
    cin>>n>>e;
    for (int a=1, start, term; a<=e; a++)
    {
        cin>>start>>term;
        s[start].push_back(term), s[term].push_back(start);
    }
    for (int a=1; a<=n; a++)
    {
        cin>>v[a];
        fv+=v[a];
        q.push(a);
    }
    fv/=4;
    
    while (q.size())
    {
        int a=q.front();
        q.pop();
        cout<<a<<' '<<s[a].size()<<endl;
        if (s[a].size()==1)
        {
            int start=a, term=s[a][0];
            PII p={start, term}, rp={term, start};
            if (v[start]>fv)
            {
                ans.push_back({p, v[start]-fv});
                v[term]+=(v[start]-fv);
            }
            else if (v[start]<fv)
            {
                ans.push_back({rp, fv-v[start]});
                v[term]-=(fv-v[start]);
            }
            
            v[start]=fv;
            s[start].clear();
            auto inv=remove(s[term].begin(), s[term].end(), start);
            s[term].erase(inv, s[term].end());
        }
        else if (s[a].size()>1) q.push(a);
        
        pq(q);
        cout<<endl;
    }
    
    cout<<ans.size()<<endl;
    for (auto a:ans)
    {
        cout<<a.second<<' '<<a.first.first<<' '<<a.first.second<<endl;
    }
}

我添加了各种输出来测试结果,但最终答案是最后5行。我的方法是找到每个只有1条边连接的节点。必须存在这样的节点,因为 * E N *。fv表示每个节点中所需的最终值。设start为这样的节点,term为连接到start的唯一边的另一端。我使v[start]等于fv,并将v[term]减去/加上所需的数量,我还使用队列跟踪队列中的节点,如果大小大于1,我将其移到后面以防止无限循环。
然而,我不明白为什么这不起作用。提前感谢。

nx7onnlm

nx7onnlm1#

来自@Alan Birtles的评论指出我的问题确实存在于fv/=4s.resize(n)

相关问题