首页 > 代码库 > TOJ--2119--最小生成树和map
TOJ--2119--最小生成树和map
这题 唯一的价值应该就是 稍微用了下map 同时也算自己对于prim算法的再次练手吧.....
touch me
其余的 没什么好讲的 就是保留1位小数 这边的数据范围 题目没有给出 我也一直不知道......明天 考6J了.....
说些什么 上帝才能听到我的祈求呢~
1 // TOJ 2119 最小生成树 2 3 #include <iostream> 4 #include <cstdio> 5 #include <cstring> 6 #include <map> 7 using namespace std; 8 9 const int size = 520; 10 const double inf = 888888888.0; 11 double length; 12 int n; 13 string name; 14 struct data 15 { 16 int num; 17 int next[50]; 18 double dist[50]; 19 }edge[size]; 20 map<string,int>mp; 21 bool vis[size]; 22 double dist[size]; 23 24 void prim() 25 { 26 int i , j , k; 27 memset( vis , false , sizeof(false) ); 28 for( i = 0 ; i<size ; i++ ) 29 { 30 dist[i] = (i==0)?0:inf; 31 } 32 for( i = 0 ; i<edge[0].num ; i++ ) 33 { 34 dist[ edge[0].next[i] ] = edge[0].dist[i]; 35 } 36 vis[0] = true; 37 double ans = 0; 38 double mmin; 39 for( i = 1 ; i<n ; i++ ) 40 { 41 mmin = inf; 42 for( j = 1 ; j<n ; j++ ) 43 { 44 if( !vis[j] && dist[j]<mmin ) 45 { 46 mmin = dist[j]; 47 k = j; 48 } 49 } 50 if( mmin == inf ) 51 { 52 break; 53 } 54 vis[k] = true; 55 ans+=mmin; 56 for( j = 0 ; j<edge[k].num ; j++ ) 57 { 58 if( dist[ edge[k].next[j] ] > edge[k].dist[j] && !vis[ edge[k].next[j] ] ) 59 { 60 dist[ edge[k].next[j] ] = edge[k].dist[j]; 61 } 62 } 63 } 64 if( ans<=length ) 65 printf( "Need %.1lf miles of cable\n",ans ); 66 else 67 printf( "Not enough cable\n" ); 68 } 69 70 int main() 71 { 72 char st[30] , end[30]; 73 double len; 74 int m; 75 int cnt; 76 while( ~scanf("%lf",&length) ) 77 { 78 mp.clear(); 79 for( int i = 0 ; i<size ; i++ ) 80 edge[i].num = 0; 81 cnt = 0; 82 scanf( "%d",&n ); 83 for ( int i = 0 ; i<n ; i++ ) 84 { 85 cin>>name; 86 mp[name] = cnt++; // 将人名映射为数字 87 } 88 scanf( "%d",&m ); 89 while( m-- ) 90 { 91 scanf( "%s %s %lf",st,end,&len ); 92 int x = mp[st]; 93 int y = mp[end]; 94 edge[x].next[ edge[x].num ] = y; 95 edge[x].dist[ edge[x].num++ ] = len; 96 edge[y].next[ edge[y].num ] = x; 97 edge[y].dist[ edge[y].num++ ] = len; 98 } 99 prim();100 }101 return 0;102 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。