关于prim
查看原帖
关于prim
110694
ChengZe楼主2020/8/1 16:57
它被卡了

同样代码O1只有65,吸氧100,  不要在意我强行插入的Kruskal算法

#include <bits/stdc++.h>
using namespace std;
const int maxn=210,maxm=6e3+10,inf=0x3f3f3f3f;
int Head[maxn],Next[maxm<<1],to[maxm<<1],w[maxm<<1],tot;
int ans,dis[maxn],n,cnt,week;

struct node{
	int pos,dis;
};
priority_queue<node> q;
bool vis[maxn];
bool operator<(node a,node b){
	return a.dis>b.dis;
}

struct node2{
	int u,v,d,day;
}E[maxm<<1];
bool operator<(node2 a,node2 b){
	return a.d<b.d;
}

void add(int u,int v,int d){
	++tot;
	Next[tot]=Head[u];
	Head[u]=tot;
	to[tot]=v;
	w[tot]=d;
}

int dij(){
	memset(dis,0x3f,sizeof(dis));
	memset(vis,0,sizeof(vis));
	while(!q.empty())q.pop();
	cnt=ans=0;
	q.push((node){1,0});dis[1]=0;
	while(!q.empty()){
		node tmp=q.top();q.pop();
		int u=tmp.pos;
		if(vis[u])continue;
		vis[u]=1;ans+=tmp.dis;cnt++;
		for(int i=Head[u];i;i=Next[i]){
			int v=to[i];
			if(dis[v]>w[i]){
				dis[v]=w[i];
				q.push((node){v,dis[v]});
			}
		}
	}
	if(cnt<=n-1)return -1;
	else return ans;
}

int fa[maxn];
int Find(int x){
	if(x!=fa[x])return fa[x]=Find(fa[x]);
	return x;
}
bool query(int x,int y){
	x=Find(x);y=Find(y);
	if(x==y)return 0;
	fa[x]=y;
	return 1;
}

int kru(int dd){
	cnt=ans=0;
	for(int i=1;i<=n;i++)fa[i]=i;
	for(int i=1;i<=week;i++)if(E[i].day<=dd&&query(E[i].u,E[i].v)){
		cnt++;ans+=E[i].d;
	}
	if(cnt<n-1)return -1;
	else return ans;
}

int main()
{
	scanf("%d%d",&n,&week);
	for(int i=1;i<=week;i++){
		int u,v,d;scanf("%d%d%d",&u,&v,&d);
		add(u,v,d);add(v,u,d);
		E[i]=(node2){u,v,d,i};
		printf("%d\n",dij());
	}
//	sort(E+1,E+1+week);
//	for(int i=1;i<=week;i++)printf("%d\n",kru(i));
	return 0;
}
2020/8/1 16:57
加载中...