http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2144&cid=1186
这道题一开始是用prim算法做的,一直错一直错,后来问了帅郭改用Kruskal做才对,再后来问了THH和二货才改对的prim算法,是因为重边我没处理啊,上火
1 #include <cstdio> 2 #include <cstring> 3 #include<cstdlib> 4 #include<iostream> 5 using namespace std ; 6 #define oo (1<<28) 7 const int N = 110 ; 8 int map[N][N],low[N],flag[N];//low数组是用来保留最小代价的; 9 //flag数组是用来标记的,找过得点就不再去找 10 int m,n; 11 int u,v,w ; 12 int prim() 13 { 14 int i,j,pos,min,ans=0; 15 memset(flag,0,sizeof(flag)); 16 flag[1]=1; 17 pos=1; 18 for(i = 1 ; i <= n ; i++) 19 if(i != pos) 20 low[i] = map[pos][i]; 21 for(i = 1 ; i < n ; i++) 22 { 23 min=oo; 24 for(j = 1 ; j <= n ; j++) 25 if(flag[j] == 0&&min>=low[j]) 26 { 27 min = low[j]; 28 pos = j ; 29 } 30 ans += min ; 31 flag[pos] = 1 ; 32 for(j = 1 ; j <= n ; j++) 33 if(flag[j] == 0&&low[j]>map[pos][j]) 34 low[j]=map[pos][j]; 35 } 36 return ans; 37 } 38 int main() 39 { 40 int ans; 41 while(scanf("%d %d",&n,&m)!=EOF) 42 { 43 for(int i = 1 ; i < N ; i++) 44 { 45 for(int j = 1 ; j < N ; j++) 46 { 47 map[i][j] = oo ; 48 } 49 } 50 for(int i = 1 ; i <= m ; i++) 51 { 52 scanf("%d %d %d",&u,&v,&w); 53 if(map[u][v] >w)//防止重边出现保留小的重边 54 map[u][v] = map[v][u] = w ; 55 } 56 ans = prim(); 57 printf("%d\n",ans); 58 } 59 return 0; 60 }