站外题求助
查看原帖
站外题求助
390186
起名字重要吗楼主2022/8/26 10:14

魔法驿站

题目背景:

有一个魔法森林中有很多个魔法驿站,驿站之间的通信需要借助魔法通道,如果使用这条魔法通道传递信息需要使用一定量的魔法币去租用才行(按天付费)。现在请问每天至少需要多少魔法币就在魔法森林里面任意两个驿站之间传递信息了呢?需要注意的是每天会有一条随机的魔法通道价格变得非常高。

输入格式:

第一行有两个整数N,M,N表示驿站数量,M表示魔法通道数量。

接下来M行,每行三个整数u,v,w,表示u号驿站到v号驿站这条魔法通道的每天的租金为w的魔法币。保证两点之间至多只有一条边。

接着一行一个正整数D,表示有D天。

下面D行,每行一个询问,询问中包含一个正整数P,表示第i天第P条边(边的编号为1~M)的价格会变得无穷大,只会持续一天。

输出格式:

D行,对于每天输出至少需要多少魔法币就在魔法森林里面任意两个驿站之间传递信息了,如果没有方案则输出“Not connected”。

限制:

1010%的数据,N,M,D<=100N,M,D<=100。

4040%的数据,N<=1000N<=1000。

100100%的数据,N<=50000,M<=100000D<=100000W<=10000N<=50000,M<=100000,D<=100000,W<=10000。

样例 1 :

输入:
4 4
1 2 3
1 3 5
2 3 9
2 4 1
4
1
2
3
4
输出:
15
13
9
Not connected

以下是我的代码,使用最小生成树:

#include <bits/stdc++.h>
using namespace std;
const int N=50000,M=100005;
int n,m,d,u[M],v[M],w[M],W,f[N],t,sum,cnt;
struct node {
	int u,v,w,id;
} a[M];
bool cmp(node x,node y) {
	return x.w<y.w;
}
int getf(int x) {
	if(f[x]==x) return x;
	return f[x]=getf(f[x]);
}
int merge(int x,int y) {
	if(f[getf(y)]!=f[getf(x)]) {
		f[getf(y)]=getf(x);
		return 1;
	}
	return 0;
}
int main() {
	cin>>n>>m;
	for(int i=1; i<=m; i++) {
		cin>>a[i].u>>a[i].v>>a[i].w;
		a[i].id=i;
	}
	cin>>d;
	sort(a+1,a+m+1,cmp);
	for(int i=1; i<=d; i++) {
		cin>>W,sum=0,cnt=0;
		for(int j=1; j<=n; j++) f[j]=j;
		for(int j=1; j<=m; j++) {
			if(a[j].id!=W&&merge(a[j].u,a[j].v)==1)
				sum+=a[j].w,cnt++;
			if(cnt==n-1) break;
		}
		if(cnt==n-1) cout<<sum<<endl;
		else cout<<"Not connected\n";
	}
	return 0;
}

结果为30分,其它点全T了,请问大佬有什么方法吗

2022/8/26 10:14
加载中...