ZOJ1586 恩 最小生成树 也不知道怎么 自己的 时间受限 后来终于搞对了 也知道时间受限为什么了 你不停止 当然时间受限啊!!
2016-10-29 20:03
483 查看
附上这个是别人写的 #include <iostream> #include <cstdio> #include <queue> #include <cmath> using namespace std; struct way { int from,to; int value; }; way w[500050]; int price[1010]; priority_queue <way>pq; int father[1010]; int sum; bool operator<( const way&a,const way&b ) { return a.value>b.value; } int find_set( int a ) { if( father[a]!=a ) { father[a]=find_set( father[a] ); } return father[a]; } void union_set( int a,int b,int c ) { if( a==b ) return; father[b]=a; sum+=c; } int main() { int T,n,i,j,t; way temp; scanf( "%d",&T ); while( T-- ) { scanf("%d",&n); for( i=0;i<n;i++ ) { scanf( "%d",&price[i] ); father[i]=i; } for( i=0;i<n;i++ ) { for( j=0;j<n;j++ ) { scanf( "%d",&t ); if( j<=i ) continue; temp.from=i; temp.to=j; temp.value=t+price[i]+price[j]; pq.push(temp); } } sum=0; while( !pq.empty() ) { temp=pq.top(); pq.pop(); union_set( find_set(temp.from),find_set(temp.to),temp.value ); } 4000 printf( "%d\n",sum ); } return 0; } 还是别人写的 #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<iostream> #include<algorithm> using namespace std; int n,map[1023][1023],f[1023],p[1023]; struct node { int x,y,s; }s[600000]; int cmp(node a,node b) { return a.s<b.s; } void inti() { for(int i=0;i<=n;i++) f[i]=i; } int find(int x) { if(x!=f[x]) return f[x]=find(f[x]); return x; } int main() { int T; cin>>T; while(T--) { cin>>n; inti(); for(int i=1;i<=n;i++) cin>>p[i]; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) scanf("%d",&map[i][j]); } int k=0; for(int i=1;i<=n;i++) { for(int j=i+1;j<=n;j++) { s[k].x=i,s[k].y=j,s[k].s=p[i]+p[j]+map[i][j]; k++; } } sort(s,s+k,cmp); int ans=0,t=0; for(int i=0;i<k;i++) { int x=find(s[i].x); int y=find(s[i].y); if(x!=y) { f[x]=y; t++; ans+=s[i].s; } if(t==n-1) break; } cout<<ans<<endl; } return 0; } 后来终于发现错误所在了 原来 #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int father[1010]; int price[1010]; struct Road { int a,b,cost; }road[550000]; int cmp(Road a,Road b) { return a.cost < b.cost; } int find(int x) { if(x != father[x]) return father[x] = find(father[x]); return x; } int merge(int x,int y) { int a = find(x); int b = find(y); if( a != b) { father[a] = b; return 1; } return 0; } int main() { int n,i,k,m,z,j,tem,ans; scanf("%d",&n); while(n--) //就是这里 怎么能够写成while(scanf("%d",&n)!=EOF)呢?? { k = 0; ans = 0; scanf("%d",&m); for(i = 1;i <= m;i++) { scanf("%d",&price[i]); father[i] = i; } memset(road,-1,sizeof(road)); for(i = 1;i <= m;i++) for (j = 1;j <= m;j++) { scanf("%d",&tem); if(j - i > 0) { road[k].cost = tem + price[i] + price[j]; road[k].a = i; road[k++].b = j; } } sort(road,road+k,cmp); z = 0; for( i = 0 ;i < k ;i++) { if(merge(road[i].a,road[i].b)) { ans += road[i].cost; z++; } if( z == m)break; } printf("%d\n",ans); } return 0; } 这个是自己之前写的 。。。。。 #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int father[1010]; int price[1010]; struct Road { int a,b,cost; }road[550000]; int cmp(Road a,Road b) { return a.cost < b.cost; } int find(int x) { if(x != father[x]) return father[x] = find(father[x]); return x; } int merge(int x,int y) { int a = find(x); int b = find(y); if( a != b) { father[a] = b; return 1; } return 0; } int main() { int n,i,k,m,z,j,tem,ans; while(scanf("%d",&n)!= EOF) ////就是这里 怎么能够写成while(scanf("%d",&n)!=EOF)呢?? { k = 0; ans = 0; scanf("%d",&m); for(i = 1;i <= m;i++) { scanf("%d",&price[i]); father[i] = i; } memset(road,-1,sizeof(road)); for(i = 1;i <= m;i++) for (j = 1;j <= m;j++) { scanf("%d",&tem); if(j - i > 0) { road[k].cost = tem + price[i] + price[j]; road[k].a = i; road[k++].b = j; } } sort(road,road+k,cmp); z = 0; for( i = 0 ;i < k ;i++) { if(merge(road[i].a,road[i].b)) { ans += road[i].cost; z++; } if( z == m)break; } printf("%d\n",ans); } return 0; }
相关文章推荐
- 通讯录的录入与显示(从相似度0.98到后来成功,但是不知道为什么,后来知道错在了生日01月的表示方法上了)
- 纠结了很久,不知道为什么除了什么原因,用任何方查都查不到根源,后来ArrayList存放了Bitmap,结果出错了,终于找到了事情的根源,一阵无语,不能存放竟静态的,为什么不提示呢, 害我以为是那些自
- 只学一点点:我的技术学习策略(虽然不赞同,但可以参考一下,针对不常用的技术可以这样,同时可以:寻找遁去的一,不用管别人怎么想;有学习的时间,不如自己写、自己实践,否则学完了都不知道是什么东西)
- 真不知道自己为什么要开始学习C#?
- 大家知道苍月((蒼ざめた月の光)苍青色的月光)在XP下怎么玩吗动不动就自己退出来
- 怎么求两个时间刻度的差呢?我好笨!终于解决了!
- [转]你真的知道自己该怎么学C++/VC?
- №男人应该知道自己应该怎么做
- 如果java中一个方法不知道要传递多少参数也不知道传递过来的是什么类型的数据你会怎么做?
- 2008年8月12号,晴,热。实验室放假的第五天。我现在丈人家,每天都是利用早上的时间写昨天的日记,每写一次,我都知道自己的假期少一天,心里或多或少都有些失落
- 大家知道苍月((蒼ざめた月の光)苍青色的月光)在XP下怎么玩吗动不动就自己退出来
- 不想让别人知道自己浏览过哪些网页和打开过哪些文件,应该怎么办?
- 第一次有自己的BLog,还不知道怎么定义css呢!
- 怎么生成随机时间比较简单??
- Windows Live Writer发布的博客时间是乱的,不知道为什么
- 现在急用 java要怎么才能学好哦 不知道能不能学好。 大概多长时间
- 嗨,睡觉吧,如果让猪猪知道了还不知道怎么生气呢,反正就是睡不着。
- 终于 知道为什么datagrid有时候翻页要双击了...
- 终于抽出时间了,可以写自己的博客了,希望能够记录自己的学习和生活过程,与朋友共勉
- 今天心情出奇的不好,自己也不知道为什么?