题目大意:给你n*n的一个临界矩形 每个数代表的是当前i行与j列的距离 之后给你Q个连通的道路 以下Q行为哪两个村庄连通 求最小连通的距离 也就是求最小生成树
解题思路:这道题甚至已经把临界矩形都告诉你了 比模板题更要水 两种for循环输入 连通的道路距离标记为0
普利姆算法
//Memory: 252 KB
//Time: 16 MS
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <map>
#include <cmath>
#include <queue>
#include <string>
#include <vector>
#include <set>
using namespace std;
#define ll long long
#define sc(x) scanf("%d",&x)
#define dsc(x,y) scanf("%d%d",&x,&y)
#define pr(x) printf("%d\n",x)
#define FOR(i,n,o) for(int i=o;i<=n;i++)
#define lcr(a,b) memset(a,b,sizeof(a))
#define Inf 1<<29
#define N 104
int n,q,a,b;
int mp[N][N],vis[N],dis[N],cis[N][N];
int pri()
{
int sum=0;
FOR(i,n,1)
{
dis[i]=mp[1][i];
}
vis[1]=1;
FOR(i,n-1,1)
{
int to=-1;
int minn=Inf;
FOR(j,n,1)
{
if(!vis[j]&&dis[j]<minn)
{
to=j;
minn=dis[j];
}
}
if(to==-1)
return 0;
vis[to]=1;
sum+=minn;
FOR(j,n,1)
{
if(!vis[j])
dis[j]=min(dis[j],mp[to][j]);
}
}
return sum;
}
int main()
{
while(~sc(n))
{
lcr(vis,0);
lcr(cis,0);
FOR(i,n,1)
{
FOR(j,n,1)
{
mp[i][j]=Inf;
}
}
FOR(i,n,1)
{
FOR(j,n,1)
{
int v;
scanf("%d",&v);
mp[i][j]=v;
}
}
sc(q);
while(q--)
{
dsc(a,b);
mp[a][b]=0;
mp[b][a]=0;
}
pr(pri());
}
return 0;
}
克鲁斯卡尔算法
//Memory: 332
//Time: 79
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <map>
#include <cmath>
#include <queue>
#include <string>
#include <vector>
#include <set>
using namespace std;
#define ll long long
#define sc(x) scanf("%d",&x)
#define dsc(x,y) scanf("%d%d",&x,&y)
#define pr(x) printf("%d\n",x)
#define FOR(i,n,o) for(int i=o;i<=n;i++)
#define lcr(a,b) memset(a,b,sizeof(a))
#define Inf 1<<29
#define N 105
int n,v,p[N],mp[N][N];
struct node
{
int x;
int y;
int l;
}q[N*N];
int Find(int x)
{
if(x!=p[x])
{
p[x]=Find(p[x]);
}
return p[x];
}
int cmp(node a,node b)
{
return a.l<b.l;
}
int Kruskal(int l)
{
int sum=0;
int to=0;
FOR(i,l,1)
{
int xx=Find(q[i].x);
int yy=Find(q[i].y);
if(xx!=yy)
{
p[yy]=xx;
sum+=q[i].l;
to++;
if(to==n-1)
return sum;
}
}
return sum;
}
int main()
{
while(~sc(n))
{
int k=1;
FOR(i,n,1)
{
p[i]=i;
FOR(j,n,1)
{
sc(v);
mp[i][j]=v;
}
}
int m;
sc(m);
while(m--)
{
int a,b;
scanf("%d %d",&a,&b);
mp[a][b]=0;
mp[b][a]=0;
}
FOR(i,n,1)
{
FOR(j,n,1)
{
q[k].x=i;
q[k].y=j;
q[k++].l=mp[i][j];
}
}
sort(q+1,q+k,cmp);
int ans=Kruskal(k);
pr(ans);
}
return 0;
}
END!!!!!!!!!!!!!!!!!!!