void dijk(int v) { memset(vis,0,sizeof(vis)); for(int i=1;i<=len;i++) dist[i]=map[v][i]; dist[v]=0; vis[v]=1; for(int i=1;i<=len;i++) { int m=maxn,f=0; for(int j=1;j<=len;j++) if(!vis[j]&&m>dist[j]) { m=dist[j]; f=j; } if(f==0) break; vis[f]=1; for(int j=1;j<=len;j++) if(!vis[j] && dist[j]>dist[f]+map[f][j]) dist[j]=dist[f]+map[f][j]; } } }
/*最小生成树是更新出t-1条边,每次选出当前符合条件最短的,并进行标记。*/ void prim() { for(i=0;i<t-1;i++) { min = inf; for(j=0;j<t;j++) if(vis[j]) for(k=0;k<t;k++) if(!vis[k]&&w[j][k]<min) { min=w[j][k]; f=k; } vis[f]=true; s+=min; } }
/* 最短路是从起点开始搜寻, 不断更新d[i]. */ void dijkstra(int start) { int i,x,y,m; memset(vis,0,sizeof(vis)); for(i=0;i<n;i++) d[i]=(i==start?0:maxn); for(i=0;i<n;i++) { m=maxn; for(y=0;y<n;y++) if(!vis[y]&&d[y]<=m) { m=d[y]; x=y; } vis[x]=1; for(y=0;y<n;y++) d[y]=min(d[y],d[x]+map[x][y]); } }
/