HDU1102 Constructing Roads(模版题)
http://acm.hdu.edu.cn/showproblem.php?pid=1102
把已经修建的城市之间值赋0,然后prim。。。
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <queue> #include <cmath> #include <algorithm> using namespace std; #define inf 1000000 #define M 105 int n,m,a,b,s[M][M],dis[M]; bool vis[M]; void prim() { vis[0]=true; for(int i=1; i<n; i++) dis[i]=s[0][i]; int sum=0,u; for(int i=1; i<n; i++) { int p=inf; for(int j=1; j<n; j++) { if(!vis[j]&&p>dis[j]) { p=dis[j]; u=j; } } vis[u]=true; sum+=p; for(int j=1; j<n; j++) if(!vis[j]&&s[u][j]<dis[j]) dis[j]=s[u][j]; } printf("%d\n",sum); } int main() { //freopen("in.txt","r",stdin); while(~scanf("%d",&n)) { for(int i=0; i<n; i++) for(int j=0; j<n; j++) scanf("%d",&s[i][j]); scanf("%d",&m); while(m--) { scanf("%d%d",&a,&b); s[a-1][b-1]=s[b-1][a-1]=0; } memset(vis,false,sizeof(vis)); prim(); } return 0; }