继续畅通工程--hdu1879(最小生成树 模板题)
http://acm.hdu.edu.cn/showproblem.php?pid=1879
刚开始么看清题 以为就是n行 后来一看是n*(n-1)/2行 是输入错误 真是够够的
#include <iostream> #include <cstring> #include <algorithm> #include <queue> #include <cstdio> #include <cstdlib> #include <cctype> #include <math.h> #include <ctype.h> using namespace std; #define memset(a,b) memset(a,b,sizeof(a)) #define N 1100 #define INF 0xfffffff typedef long long ll; int G[N][N]; int vis[N],dis[N]; int n; int prime(int s) { int ans=0; memset(vis,0); for(int i=1;i<=n;i++) { dis[i]=G[s][i]; } vis[s]=1; for(int i=1;i<n;i++) { int Min=INF,dist; for(int j=1;j<=n;j++) { if(vis[j]==0 && Min>dis[j]) { Min=dis[j]; dist=j; } } vis[dist]=1; ans+=Min; for(int j=1;j<=n;j++) { if(!vis[j] && dis[j]>G[dist][j]) dis[j]=G[dist][j]; } } return ans; } int main() { int u,v,f,is; while(scanf("%d",&n),n) { for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { G[i][j]=INF; } dis[i]=INF; } for(int i=0;i<n*(n-1)/2;i++) { scanf("%d %d %d %d",&u,&v,&f,&is); if(is==1) { f=0; } G[u][v]=G[v][u]=f; } int aa=prime(1); printf("%d\n",aa); } }