6个TLE 求助大佬剪枝优化
查看原帖
6个TLE 求助大佬剪枝优化
239164
Meteorshower_Y楼主2020/10/18 20:13
#include<iostream>
#include<utility>
#include<cstdio>
#include<stdlib.h>
#include<queue>
#include<map>
using namespace std;
map <int,int> f[5100];
int n,m,x,y,z,ans;
bool b[5010];
inline int read()          //qwq没什么用的快读 
{
	int x=0;
	char c=getchar();
	{
		while(c<'0'||c>'9') c=getchar();
	}
	while(c>='0'&&c<='9')
	{
		x=x*10+(c-'0');
		c=getchar();
	}
	return x;
}
inline void bfs(int k)               //其实不是bfs 瞎打的 
{
	if(k==n) return ;                //边界 
	priority_queue< pair<int,int> >q;
	int tot=0;
	for(register int x=1;x<=n;x++)   //记录没有访问过的边到没有访问过的边的权值,贪心最短的 
	{
		if(tot==k) break;
		if(b[x]==0) continue;
		tot++;
		for(register int i=1;i<=n;i++)
		{
			if(f[x][i]>0&&b[i]==0)
			{
				q.push(make_pair(-f[x][i],-i));
			}
		}
	}
	if(q.size()==0)                 //不连通 
	{
		cout<<"orz";
		exit(0);
	}
	b[-q.top().second]=1;
	ans+=-q.top().first;
	bfs(k+1);
}
int main()
{
	n=read();
	m=read();
	for(register int i=1;i<=m;i++)
	{
		x=read();
		y=read();
		z=read();
		if(f[x][y]==0)
		{
			f[x][y]=f[y][x]=z;
		}
		else f[x][y]=f[y][x]=min(z,f[x][y]);   //存图 
	}
	b[1]=1;
	bfs(1);
	cout<<ans;
}
2020/10/18 20:13
加载中...