华师一附中OI组
标题:
P3366 【模板】最小生成树
[打印本页]
作者:
admin
时间:
2018-5-4 10:02
标题:
P3366 【模板】最小生成树
https://www.luogu.org/problemnew/show/P3366
题目描述
如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz
输入输出格式
输入格式:
第一行包含两个整数N、M,表示该图共有N个结点和M条无向边。(N<=5000,M<=200000)
接下来M行每行包含三个整数Xi、Yi、Zi,表示有一条长度为Zi的无向边连接结点Xi、Yi
输出格式:
输出包含一个数,即最小生成树的各边的长度之和;如果该图不连通则输出orz
输入输出样例
输入样例#1:
4 5
1 2 2
1 3 2
1 4 3
2 3 4
3 4 3
输出样例#1:
7
说明
时空限制:1000ms,128M
数据规模:
对于20%的数据:N<=5,M<=20
对于40%的数据:N<=50,M<=2500
对于70%的数据:N<=500,M<=10000
对于100%的数据:N<=5000,M<=200000
作者:
倚窗倾听风吹雨
时间:
2018-9-12 21:27
#include<iostream>
using namespace std;
const int M=5010;
int n,m,x,y,len=0;
int a[M][M],ans,mina,pos;
bool visit[M],flag;
int main()
{
cin>>n>>m;
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
a[i][j]=999999;
for(int i=1; i<=m; i++)
{
cin>>x>>y;
int pi;
cin>>pi;
if(a[x][y]>pi)
{
a[x][y]=pi;
a[y][x]=a[x][y];
}
}
for(int i=1; i<=n; i++)
a[i][i]=0;
while(len<n)
{
mina=9999;
for(int i=1; i<=n; i++)
{
if(visit[i])
continue;
if(a[1][i]<mina)
{
mina=a[1][i];
pos=i;
}
}
// cout<<pos<<" ";
ans+=mina;
visit[pos]=1;
len++;
for(int i=1; i<=n; i++)
{
if(visit[i])
continue;
if(a[pos][i]<a[1][i])
a[1][i]=a[pos][i];
}
}
cout<<ans<<endl;
return 0;
}
复制代码
作者:
倚窗倾听风吹雨
时间:
2018-9-12 21:28
还可以用堆排优化,emmm,太懒懒得打了,能AC就行
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2