题解:
莫名其妙超时几次,最后才发现是最后一句cout的问题,改成printf就ac了,还是不能混用的好
一个最小生成树模板题,已经建好的路用0标记
用的prim算法
prim
#define mem(a,b) memset(a,b,sizeof(a))
#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f;
const int maxn=100;
int Map[maxn][maxn];
int vis[maxn];
int dis[maxn];
int n;
int prim(int st)
{
//initialize
int ans=0;
mem(vis,0);
for(int i=0;i<n;++i)
dis[i]=Map[st][i];
vis[st]=1;
//processing
for(int i=0;i<n;++i)
{
//select the min V
int mins=INF;
int v=-1;
for(int j=0;j<n;++j)
if(!vis[j]&&mins>dis[j])
mins=dis[j],v=j;
//can't process n times
//if(mins==INF)
//return -1;
if(v==-1||mins==INF)
break;
//update
ans+=mins;
vis[v]=1;
//cout<<mins<<endl;
for(int j=0;j<n;++j)
if(!vis[j]&&dis[j]>Map[v][j])
dis[j]=Map[v][j];
}
return ans;
}
int main()
{
while(~scanf("%d",&n))
{
mem(Map,INF);
for(int i=0;i<n;++i)
for(int j=0;j<n;++j)
scanf("%d",&Map[i][j]);
int x,y,roads;
scanf("%d",&roads);
for(int i=0;i<roads;++i)
{
scanf("%d%d",&x,&y);
Map[x-1][y-1]=Map[y-1][x-1]=0;
}
int ans=prim(0);
printf("%d\n",ans);
}
}
kruskal
并查集+优先队列实现
//写了一会,又出bug了,还是少弄全局变量,被自己坑到了
#define mem(a,b) memset(a,b,sizeof(a))
#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f;
const int maxn=100;
int Map[maxn][maxn];
int n;
struct node
{
int x,y;
int w;
node(int xx,int yy,int ww)
{
x=xx,y=yy,w=ww;
}
};
bool operator <(const node a,const node b)
{
return a.w>b.w;
}
int F[maxn];
int f(int x)
{
if(x==F[x])
return x;
return F[x]=f(F[x]);
}
void Union(int x,int y)
{
x=f(x),y=f(y);
if(x!=y)
F[x]=y;
}
void ini(int n)
{
for(int i=0;i<n;++i)
F[i]=i;
}
int main()
{
while(~scanf("%d",&n))
{
mem(Map,INF);
for(int i=0;i<n;++i)
for(int j=0;j<n;++j)
scanf("%d",&Map[i][j]);
int x,y,roads;
scanf("%d",&roads);
for(int i=0;i<roads;++i)
{
scanf("%d%d",&x,&y);
Map[x-1][y-1]=Map[y-1][x-1]=0;
}
priority_queue<node>pq;
for(int i=0;i<n;++i)
for(int j=i+1;j<n;++j)
pq.push(node(i,j,Map[i][j]));
int ans=0;
ini(n);
while(!pq.empty())
{
node t=pq.top();
pq.pop();
//cout<<t.x<<":"<<f(t.x)<<endl;
//cout<<t.y<<":"<<f(t.y)<<endl;
if(f(t.x)!=f(t.y))
/*cout<<t.w<<" "<<t.x<<" "<<t.y<<endl,*/Union(t.x,t.y),ans+=t.w;
//system("pause");
}
printf("%d\n",ans);
}
}