为什么现算就WA了,存边就AC了?
查看原帖
为什么现算就WA了,存边就AC了?
1085016
Moros楼主2024/9/26 00:43

存边代码

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int MAXN=1e5+10;
struct Edge{
    int from,to,val;
};
std::vector<Edge> edges[MAXN];
void add(int from,int to,int val){
    Edge e={from,to,val};
    edges[from].push_back(e);
}
int main(){
    int n,m,k,w;
    cin>>n>>m>>k>>w;
    std::vector<std::vector<string>> s(k,std::vector<string>(n));
    std::vector<std::vector<int>> dis(k,std::vector<int>(k,n*m));
    //std::vector<int> fa(k,0);
    for (int i = 0; i < k; ++i)
    {
        dis[i][i]=0;
        for (int j = 0; j < n; ++j)
        {
            cin>>s[i][j];
        }
    }
    int res=0;
    std::vector<bool> vis(k,false);
    std::vector<pair<int,int>> ans;
    priority_queue<tuple<int,int,int>,std::vector<tuple<int,int,int>>,greater<>> pq;
    for (int i = 0; i < k; ++i)
    {
        for (int j = i+1; j < k; ++j)
        {
            int cost=0;
            for (int x = 0; x < n; ++x)
            {
                for (int y = 0; y < m; ++y)
                {
                    if(s[i][x][y]!=s[j][x][y])  cost+=w;
                }
            }
            dis[i][j]=min(dis[i][j],cost);
            dis[j][i]=dis[i][j];
        }
    }
    auto prim=[&]()
    {
        pq.push({n*m,0,0});
        while(!pq.empty())
        {
            auto [d,id,fa]=pq.top();
            pq.pop();
            if(vis[id]) continue;
            vis[id]=true;
            res+=d;
            if(d==n*m)
            {
                ans.push_back({id+1,0});
            }
            else
            {
                ans.push_back({id+1,fa+1});
            }
            for (int i = 0; i < k; ++i)
            {
                if(vis[i])  continue;
                pq.push({dis[id][i],i,id});
            }
        }
    };
    prim();
    cout<<res<<"\n";
    for (int i = 0; i < ans.size(); ++i)
    {
        cout<<ans[i].first<<" "<<ans[i].second<<"\n";
    }
}

现算代码

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int MAXN=1e5+10;
struct Edge{
    int from,to,val;
};
std::vector<Edge> edges[MAXN];
void add(int from,int to,int val){
    Edge e={from,to,val};
    edges[from].push_back(e);
}
int main(){
    int n,m,k,w;
    cin>>n>>m>>k>>w;
    std::vector<std::vector<string>> s(k,std::vector<string>(n));
    //std::vector<std::vector<int>> dis(k,std::vector<int>(k,n*m));
    //std::vector<int> fa(k,0);
    for (int i = 0; i < k; ++i)
    {
        //dis[i][i]=0;
        for (int j = 0; j < n; ++j)
        {
            cin>>s[i][j];
        }
    }
    int res=0;
    std::vector<bool> vis(k,false);
    std::vector<pair<int,int>> ans;
    priority_queue<tuple<int,int,int>,std::vector<tuple<int,int,int>>,greater<>> pq;
    // for (int i = 0; i < k; ++i)
    // {
    //     for (int j = i+1; j < k; ++j)
    //     {
    //         int cost=0;
    //         for (int x = 0; x < n; ++x)
    //         {
    //             for (int y = 0; y < m; ++y)
    //             {
    //                 if(s[i][x][y]!=s[j][x][y])  cost+=w;
    //             }
    //         }
    //         dis[i][j]=min(dis[i][j],cost);
    //         dis[j][i]=dis[i][j];
    //     }
    // }
    auto cal=[&](int u, int v)
    {
        int diff=0;
        for (int i = 0; i < n; ++i)
        {
            for (int j = 0; j < m; ++j)
            {
                if(s[u][i][j]!=s[v][i][j])  diff+=w;
            }
        }
        return diff;
    };
    auto prim=[&]()
    {
        pq.push({n*m,0,0});
        while(!pq.empty())
        {
            auto [d,id,fa]=pq.top();
            pq.pop();
            if(vis[id]) continue;
            vis[id]=true;
            res+=d;
            if(d==n*m)
            {
                ans.push_back({id+1,0});
            }
            else
            {
                ans.push_back({id+1,fa+1});
            }
            for (int i = 0; i < k; ++i)
            {
                if(vis[i])  continue;
                int val=cal(i,id);
                pq.push({val,i,id});
            }
        }
    };
    prim();
    cout<<res<<"\n";
    for (int i = 0; i < ans.size(); ++i)
    {
        cout<<ans[i].first<<" "<<ans[i].second<<"\n";
    }
}
2024/9/26 00:43
加载中...