hdu1863
2015-07-29 17:28
351 查看
没有理由不对呀
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; int cost[110][110]; int mincost[110]; bool used[110]; int sett[110]; int M; int prim() { for(int i=0;i<=M;i++) { mincost[i]=2147483646; used[i]=false; } mincost[1]=0; int res=0; while(true){ int v=-1; for(int i=1;i<=M;i++) printf("%d ",mincost[i]); for(int i=1;i<=M;i++) if(!used[i] && (v==-1||mincost[i]<mincost[v])) v=i; printf("v==%d\n",v); if(v==-1) break; used[v]=true; res+=mincost[v]; for(int i=1;i<=M;i++) { mincost[i] = min(mincost[i],cost[v][i]); } } return res; } int find2(int x) { while(x!=sett[x]) x=sett[x]; return x; } int main() { int N; while(scanf("%d%d",&N,&M)&&N){ int flag=0; for(int i=0;i<=M;i++) sett[i]=i; while(N--){ int a,b,c; scanf("%d%d%d",&a,&b,&c); cost[a][b]=c; int fa = find2(a); int fb = find2(b); if(fa!=fb) sett[fa]=fb; } int coutt=0; for(int i=1;i<=M;i++) if(sett[i]==i) coutt++; if(coutt > 1) flag=1; for(int i=1;i<=M;i++) for(int j=1;j<=M;j++) if(cost[i][j]==0) cost[i][j]= 2147483647; for(int i=1;i<=M;i++){ for(int j=1;j<=M;j++) printf("%d ",cost[i][j]); printf("\n"); } if(flag) printf("?\n"); else printf("%d\n",prim()) ; } return 0; }
相关文章推荐
- Christine Daaé
- 这是一道BFS入门题
- 元组(tuple)、列表[list]的区别
- JAVA自学路线图
- VC7(VS2002)调试时 std::string 超过15字符乱码问题
- “/”应用程序中的服务器错误
- Xutils框架-HTTP使用详解
- HDU 5318 The Goddess Of The Moon(矩阵快速幂)
- hd1856 More is better
- Oracle 查看收集统计信息
- javascript理解参数
- hadoop
- 【CSS学习】CSS Id 和 Class
- asp.net出现的异常:"由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值" 的解决方法
- [html5]离线存储
- Java 划分排序
- Core Animaiton - 7
- UnicodeEncodeError: 'gbk' codec can't encode character ...
- 问题解决:Ubuntu 12.04在vmware10下无法进入Unity模式
- spring+springmvc+hibernate完整示例