Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 21243 Accepted Submission(s): 9144
3 3 1 2 1 1 3 2 2 3 4 1 3 2 3 2 0 100
3 ?
<span style="font-size:12px;"><span style="font-size:12px;">#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,m,per[5000]; struct node { int x,y,w; }row[5000]; int cmp(node a,node b) { return a.w<b.w; } int find(int x) { int r=x; int t; while(r!=per[r]) r=per[r]; while(r!=x) { t=per[x]; per[x]=r; x=t; } return r; } int meger(int x,int y) { int fx,fy; fx=find(x); fy=find(y); if(fx!=fy) { per[fx]=fy; return 1;//若没有连通返回1 } return 0;//若连通了,返回0 } int main() { int i,sum; while(scanf("%d%d",&n,&m)&&n!=0) { for(i=1;i<=m;i++) per[i]=i; for(i=0;i<n;i++) scanf("%d%d%d",&row[i].x,&row[i].y,&row[i].w); sort(row,row+n,cmp); sum=0; for(i=0;i<n;i++) { if(meger(row[i].x,row[i].y)) sum+=row[i].w;//没有连通,则将其连通,记录花费的成本 } int count=0; for(i=1;i<=m;i++) { if(per[i]==i)//全部连通了,则count的值为1,大于1表示还有没有连通的城市 count++; } if(count>1) printf("?\n"); else printf("%d\n",sum); } return 0; }</span></span>
prim算法,代码如下:
<span style="font-size:12px;">#include<cstdio> #include<cstring> #define INF 0x3f3f3f int map[110][110],n,sum,m; void prim() { sum=0; int i,j,next,min; int lowcost[110],visit[110]; memset(visit,0,sizeof(visit)); for(i=1;i<=m;++i) lowcost[i]=map[1][i]; visit[1]=1; for(i=2;i<=m;++i) { min=INF; for(j=1;j<=m;++j) { if(!visit[j]&&lowcost[j]<min) { min=lowcost[j]; next=j; } } if(min==INF)//没有找到比min小的道路,表示当前城市间与任何城市都无连通 { printf("?\n"); return ; } sum+=min; visit[next]=1; for(j=1;j<=m;++j) { if(!visit[j]&&lowcost[j]>map[next][j]) lowcost[j]=map[next][j]; } } printf("%d\n",sum); } int main() { int i,x,y,z; while(scanf("%d%d",&n,&m)&&n) { memset(map,INF,sizeof(map));//注意初始化 while(n--) { scanf("%d%d%d",&x,&y,&z); map[x][y]=map[y][x]=z; } prim(); } return 0; }</span>