prime题目
AcWing 1141. 局域网(Prim最小生成树)
AcWing 1141. 局域网(Prim最小生成树)
- 最小生成树prim做法,一点找一条最短的边,并把其他边给扔掉
- 双向网线相当于是无向图
- 此题先统计一下所有路径长,再把它减去prim返回的路径长可以得到最多科节省的资金
- 相当于a-b=c,尽可能让b小点,从而使c大点
#include<bits/stdc++.h>
using namespace std;
int n,k,sum=0;
const int N = 1e2+10,M =2e2+10,INF = 0x3f3f3f3f;
int g[N][N];
int prim()
{
int res=0;
int dist[N];
bool used[N];
memset(dist,0x3f,sizeof(dist));
memset(used,false,sizeof(used));
for(int i=0;i<n;i++)
{
int t=-1;
for(int j=1;j<=n;j++)
{
if( (!used[j]) && (t==-1||dist[t]>dist[j]) )
t=j;
}
if(i&&dist[t]!=INF)res+=dist[t];
//当i=0时,只是对路径或者说是dist数组进行预热
//可能有不连通的存在
for(int j=1;j<=n;j++)
dist[j] = min(dist[j],g[t][j]);
used[t] = true;//用完不要再用了
}
return res;
}
int main()
{
memset(g,0x3f,sizeof(g));
cin>>n>>k;
for(int i=0;i<k;i++)
{
int I,J,m;
cin>>I>>J>>m;
g[I][J]=g[J][I]=min(g[I][J],m);//处理重边和双向路径
sum+=m;
}
cout<<sum-prim();
return 0;
}
AcWing 1142. 繁忙的都市(Prim最小生成树)
AcWing 1142. 繁忙的都市
#include<bits/stdc++.h>
using namespace std;
int n,k,sum=0;
const int N = 1e2+10,M =2e2+10,INF = 0x3f3f3f3f;
int g[N][N];
int prim()
{
int res=0;
int dist[N];
bool used[N];
memset(dist,0x3f,sizeof(dist));
memset(used,false,sizeof(used));
for(int i=0;i<n;i++)
{
int t=-1;
for(int j=1;j<=n;j++)
{
if( (!used[j]) && (t==-1||dist[t]>dist[j]) )
t=j;
}
if(i&&dist[t]!=INF)res+=dist[t];
//当i=0时,只是对路径或者说是dist数组进行预热
//可能有不连通的存在
for(int j=1;j<=n;j++)
dist[j] = min(dist[j],g[t][j]);
used[t] = true;//用完不要再用了
}
return res;
}
int main()
{
memset(g,0x3f,sizeof(g));
cin>>n>>k;
for(int i=0;i<k;i++)
{
int I,J,m;
cin>>I>>J>>m;
g[I][J]=g[J][I]=min(g[I][J],m);//处理重边和双向路径
sum+=m;
}
cout<<sum-prim();
return 0;
}