一道最小生成树的题目。 用prim算法进行。 只需要注意把已经建好的路置为0就行。
#include <iostream> #include<string.h> #define MAX 1005 #define max 100000 using namespace std; int arcs[MAX][MAX]; int lowcost[MAX],used[MAX]; int main() { int i,m,s,a,b,j,k;
int vexnum,min; while(cin>>vexnum) { memset(used ,0 ,sizeof(used)); for(i=1;i<=vexnum;i++) for(j=1;j<=vexnum;j++) cin>>arcs[i][j]; cin>>m; for(i=0;i<m;i++) { cin>>a>>b; arcs[a][b]=arcs[b][a]=0; } for(i=1;i<=vexnum;i++) lowcost[i]=arcs[1][i]; lowcost[1]=0;k=1;s=0; for(i=1;i<=vexnum;i++) { min=max; for(j=1;j<=vexnum;j++) if(lowcost[j]<min&&!used[j]) { min=lowcost[j]; k=j; } used[k]=1; s=s+lowcost[k]; for(j=1;j<=vexnum;j++) if(arcs[k][j]<lowcost[j]) { lowcost[j]=arcs[k][j]; } } cout<<s<<endl; } return 0; } |
转载于:https://www.cnblogs.com/zuckerTT/archive/2011/09/25/2189844.html