最小生成树系列,总算我也有道题能在杭电上做到第一了,感动啊
跟畅通一样,用prim就可以搞定
#include <iostream> using namespace std; #define inf 10000000 int Dis[110][110],sum; struct Edge { int point; int lowcost; }edge[110]; int main() { int n,i,j,q,a,b,k,min; while(scanf("%d",&n)==1) { for (i=0;i<n;i++) for (j=0;j<n;j++) scanf("%d",&Dis[i][j]); scanf("%d",&q); for (i=0;i<q;i++) { scanf("%d %d",&a,&b); Dis[a-1][b-1]=Dis[b-1][a-1]=0; } k=0;j=0; sum=0; for (i = 0;i < n;i++) { edge[i].point = i; edge[i].lowcost = Dis[j][i]; } edge[j].lowcost = -1; for (i=0;i<n;i++) { min=inf; for (j=0;j<n;j++) { if (edge[j].lowcost!=- 1&&edge[j].lowcost<min) { k=j; min=edge[j].lowcost; } } sum+=edge[k].lowcost; edge[k].lowcost=-1; for (j=0;j<n;j++) if (Dis[k][j]<edge[j].lowcost) { edge[j].point=k; edge[j].lowcost=Dis[k][j]; } } printf("%d\n",sum+1); } return 0; }