PKU 1258-Agri-Net
問題概要
グラフの隣接行列表現が与えられる.最小全域木を作るのに必要なコストを求めろ.
解法
プリム法
実装(C++)
#include <vector> #include <cstdio> #include <algorithm> using namespace std; typedef vector<vector<int> > Matrix; #define REP(i,x)for(int i=0;i<x;i++) int prim(const Matrix &G){ int V=G.size(); vector<int> d(V,99999999); vector<bool> used(V,false); int ans=0; d[0]=0; REP(i,V){ int m=99999999,n=-1; REP(j,V) if(!used[j]&&m>d[j]) m=d[j],n=j; if(n==-1)return -1; //非連結 used[n]=true; ans+=d[n]; REP(j,V) d[j]=min(d[j],G[n][j]); } return ans; } int main() { int V; for(;~scanf("%d",&V);){ Matrix G(V,vector<int>(V)); for(int i=0;i<V;i++){ for(int j=0;j<V;j++){ scanf("%d",&G[i][j]); } } printf("%d\n",prim(G)); } return 0; }