比赛 20241127 评测结果 RRRRRRRRRR
题目名称 魔法药水 最终得分 0
用户昵称 会挽弯弓满月 运行时间 2.104 s
代码语言 C++ 内存使用 3.15 MiB
提交时间 2024-11-27 11:52:41
显示代码纯文本
#include <bits/stdc++.h> 
using namespace std;
int n;
int cost[1010];
int a,b,c;
vector<int> s[1010];
vector<int> zhi[1010];
int ru[1010];
queue<int> yao;
int f[1010];
int fang[1010];
void topo()
{
    queue<int> q;
    for(int i=0;i<n;i++)
    {
        if(ru[i]==0)
        {
            q.push(i);
            yao.push(i);
        }
    }
    while(!q.empty())
    {
        int t=q.front();
        q.pop();
        for(int i=0;i<s[t].size();i++)
        {
            ru[s[t][i]]--;
            if(ru[s[t][i]]==0)
            {
                q.push(s[t][i]);
                yao.push(s[t][i]);
            }
        }
    }
}
int ans;
bool vis[1010];
void dfs(int x)
{
    if(vis[x]) return ;
    vis[x]=1;
    ans+=fang[x];
    for(int i=0;i<s[x].size();i++)
    {
        dfs(zhi[x][i]);
    }
}
int main()
{
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d",cost+i);
        fang[i]=1;
        f[i]=0x3fff;
    }
    while(cin>>a>>b>>c)
    {
        s[a].push_back(c);
        s[b].push_back(c);
        zhi[c].push_back(a);
        zhi[c].push_back(b);
        ru[c]+=2;
    }
    topo();
    int t;
    while(!yao.empty())
    {
        t=yao.front();
        yao.pop();
        if(t==2)
        {
            
        }
        if(zhi[t].size()==2)
        {
            int zuo,you;
            zuo=zhi[t][0];
            you=zhi[t][1];
            cout<<cost[t]<<" "<<f[zuo]+f[you]<<endl;
            f[t]=min(cost[t],f[zuo]+f[you]);
            if(cost[t]==f[zuo]+f[you]) fang[t]++;
        }
        else f[t]=cost[t];
    }
    for(int i=0;i<n;i++)
    {
        cout<<fang[i]<<" ";
    }
    cout<<endl;
    for(int i=0;i<n;i++)
    {
        cout<<f[i]<<" ";
    }
    cout<<endl;
    dfs(0);
    cout<<f[0]<<" "<<ans;
    return 0;
}