Compare commits

...

3 Commits

Author SHA1 Message Date
e75cbc7b1b feat: 添加P14361.cpp解题代码实现
实现了一个解决特定问题的算法,包含深度优先搜索和贪心策略。对于小规模输入使用DFS,大规模输入采用排序和贪心选择策略来优化性能。
2025-11-04 13:38:26 +08:00
d4b17f35cc feat(P5022): 添加树遍历算法以处理带删除边的特殊情况
实现新的DFS算法来处理当m≠n-1时需要尝试删除每条边的情况。添加了新的数据结构来存储边信息和比较不同删除方案的结果。当检测到环时,会尝试删除每条边并比较所有可能的遍历顺序,选择字典序最小的方案。
2025-11-04 11:10:05 +08:00
ce9f41f580 feat: 添加P5022题的DFS解法实现
实现基于优先队列的DFS遍历算法,用于解决图论题目P5022。使用bitset标记访问节点,确保正确遍历无向图。
2025-11-04 09:47:51 +08:00
2 changed files with 158 additions and 0 deletions

81
src/11/3/P5022.cpp Normal file
View File

@ -0,0 +1,81 @@
#include <algorithm>
#include <bitset>
#include <cstdint>
#include <cstdio>
#include <functional>
#include <iostream>
#include <istream>
#include <queue>
#include <utility>
#include <vector>
using ll = int64_t;
const ll maxn = 5000+7;
ll n,m,edge[maxn][2],del=-1,sum=0;
std::vector<std::priority_queue<ll,std::vector<ll>,std::greater<ll>>> e,ne;
std::bitset<maxn> b;
std::vector<ll>nans,ans;
#define printf
static inline void dfs(ll f,ll now){
sum++;
printf("dfs f=%lld, now=%lld, sum=%lld\n",f,now,sum);
if(del==-1)std::cout<<now<<" ";
if(del!=-1)nans[sum]=now;
if(del!=-1 && sum==m){
printf("GOT NEW ANS\n");
if(nans<ans){
std::swap(nans,ans);
}
}
while(e[now].size()){
ll top = e[now].top();
e[now].pop();
if(del!=-1 && ((edge[del][0]==now&&edge[del][1]==top)||(edge[del][1]==now&&edge[del][0]==top))){
printf("continue now=%lld, top=%lld\n",now,top);
continue;
}
printf("top=%lld\n",top);
if(b[top])continue;
b[top]=true;
dfs(now,top);
}
printf("---dfs f=%lld, now=%lld\n",f,now);
}
int main(){
std::iostream::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cin>>n>>m;
e.resize(n+1);
nans.resize(n+1);
ans.resize(n+1);
b[1]=true;
for(ll i=1;i<=m;i++){
ll u,v;
std::cin>>u>>v;
edge[i][0]=u,edge[i][1]=v;
e[u].push(v);
e[v].push(u);
}
for(ll i=1;i<=m;i++)ans[i]=1e9+7;
ne=e;
if(m==n-1){
dfs(0,1);
}else{
for(ll i=1;i<=m;i++){
printf("BEGIN TREE i=%lld\n",i);
e=ne;
b.reset();
b[1]=true;
del=i;
sum=0;
dfs(0, 1);
}
for(int i=1;i<=n;i++){
std::cout<<ans[i]<<" ";
}
std::cout<<"\n";
}
std::cout<<"\n";
}

77
src/11/4/P14361.cpp Normal file
View File

@ -0,0 +1,77 @@
#include <algorithm>
#include <bitset>
#include <cstdint>
#include <iostream>
#include <istream>
#include <vector>
using ll = int64_t;
#define sl static inline
const ll maxn = 1e5+7;
ll n,a[maxn][4],ans,club[4];
struct S{
ll diff,raw,i,j;
inline bool operator<(const S&o)const{
if(diff==o.diff)return raw>o.raw;
return diff>o.diff;
}
};
std::vector<S>s;
std::bitset<maxn> vis;
sl void dfs(ll now,ll nans){
if(now==n+1){
ans=std::max(ans,nans);
return;
}
for(ll i=1;i<=3;i++){
if(club[i]>=n/2)continue;
club[i]++;
dfs(now+1,nans+a[now][i]);
club[i]--;
}
}
sl bool smallsolve(){
if(n>10)return false;
dfs(0,0);
std::cout<<ans<<"\n";
return true;
}
sl void solve(){
std::cin>>n;
ans=0;
vis.reset();
s.clear();
club[1]=club[2]=club[3]=0;
for(ll i=1;i<=n;i++){
std::cin>>a[i][1]>>a[i][2]>>a[i][3];
}
if(smallsolve())return;
for(ll i=1;i<=n;i++){
ll tmp[4];
for(ll j=1;j<=3;j++)tmp[j]=a[i][j];
std::sort(tmp+1,tmp+4);
for(ll j=1;j<=3;j++){
s.push_back({a[i][j]-tmp[2],a[i][j],i,j});
}
}
std::sort(s.begin(),s.end());
for(const auto[diff,raw,i,j]:s){
if(vis[i])continue;
if(club[j]>=n/2)continue;
vis[i]=true;
club[j]++;
ans+=raw;
}
std::cout<<ans<<"\n";
}
int main(){
std::iostream::sync_with_stdio(false);
std::cin.tie(nullptr);
ll t;
std::cin>>t;
while(t--)solve();
}