题目:http://acm.hdu.edu.cn/showproblem.php?pid=1102
又是最小生成树的裸体。。基本和1879类似。。。直接COPY1879的模版。
下面是AC代码:
#include<iostream> using namespace std; #define N 9999999 int map[101][101]; int mark[101]; bool visited[101]; int n; int prim() { int i,j,k,sum=0,min; memset(mark,0,sizeof(mark)); memset(visited,0,sizeof(visited)); k=1; visited[k]=1; for(i=2;i<=n;i++) { mark[i]=map[k][i]; //计算k到各顶点的距离 } min=N; for(i=1;i<=n-1;i++) { for(j=1;j<=n;j++) if(mark[j]<min&&!visited[j]) { min=mark[j]; k=j; } visited[k]=1; for(j=1;j<=n;j++) { if(mark[j]>map[k][j]&&!visited[j]) mark[j]=map[k][j]; } sum+=min; min=N; } return sum; } int main() { int i,j,q; int a,b,s,x; while(cin>>n&&n) { for(i=1;i<=n;i++) for(j=1;j<=n;j++) { cin>>map[i][j]; } cin>>q; for(i=1;i<=q;i++) { cin>>a>>b; map[a][b]=0; map[b][a]=0; } printf("%d\n",prim()); } return 0; }