社区讨论

WA10pts求条,必关

P2323[HNOI2006] 公路修建问题参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mi4jdsoi
此快照首次捕获于
2025/11/18 20:15
4 个月前
此快照最后确认于
2025/11/20 04:04
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>

using namespace std;
int n,m,k;
const int N=30005;
bool used[N<<1];
int fa[N];
inline int find(int x){
	return fa[x]==x?x:fa[x]=find(fa[x]);
}
struct Ans{
	int id,flag;
	bool operator<(const Ans& o)const{
		return id<o.id;
	}
}ans[N];
int tot;
struct Tree{
	struct node{
		int u,v,w,id;
		bool operator<(const node& o)const{
			return w<o.w;
		}
	}e[N<<1],g[N<<1];
	int cnt;
	inline void add(int u,int v,int w,int i){
		g[++cnt]={u,v,w,i};
	}
	inline int krul(int cnt,int sum,int flag){
		int res=0,anss=0;
		sort(g+1,g+cnt+1);
		for(int i=1;i<=cnt&&res<sum;i++){
			int u=find(g[i].u),v=find(g[i].v);
			if(u==v) continue;
			anss=max(anss,g[i].w);
			fa[v]=u;
			ans[++tot]={g[i].id,flag};
			res++;
		}
		return anss;
	}
}T1,T2;
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>n>>k>>m;
	for(int i=1;i<=n;i++) fa[i]=i;
	for(int i=1;i<m;i++){
		int u,v,w1,w2;
		cin>>u>>v>>w1>>w2;
		T1.add(u,v,w1,i);
		T2.add(u,v,w2,i);
	}
	cout<<max(T1.krul(T1.cnt,k,1),T2.krul(T2.cnt,n-1-k,2))<<"\n";
	sort(ans+1,ans+tot+1);
	for(int i=1;i<=tot;i++) cout<<ans[i].id<<" "<<ans[i].flag<<"\n";
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...