HDU 2122

题目大意很简单

就是给你城市的数量,和可以修建的铁路及其长度,如果连通,输出最小的总长,否则输出impossible

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2122

我用的prim算法一直报错也不知道为什么,后来改用Kruscal算法就好了~~T T;

正确代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 #define N 1010
 7 #define LL long long
 8
 9 int n,M,S,T,C,t,k;
10 LL ans;
11 int fa[N];
12
13 struct Path{
14     int x,y,d;
15     bool operator<(const Path &m)const{
16         return d<m.d;
17     }
18 }path[10010];
19
20 int getHead(int x)
21 {
22     int a=x;
23     while(x!=fa[x]) x=fa[x];
24     fa[a]=x;
25     return x;
26 }
27
28 bool Union(int x,int y)
29 {
30     int fa_x=getHead(x);
31     int fa_y=getHead(y);
32     if(fa_x==fa_y) return false;
33     fa[fa_x]=fa_y;
34     return true;
35 }
36
37 int main()
38 {
39     while(scanf("%d%d",&n,&M)!=EOF){
40         t=0,k=0,ans=0;
41         for(int i=0;i<n;i++) fa[i]=i;
42         if(n==0) {cout<<0<<endl;continue;}
43             //cout<<MAXN<<endl;
44         for(int i=0;i<M;i++)  scanf("%d%d%d",&S,&T,&C),path[k].x=S,path[k].y=T,path[k++].d=C;
45         sort(path,path+k);
46
47         for(int i=0;i<k;i++){
48             if(Union(path[i].x,path[i].y))
49                 ans+=path[i].d,t++;
50         }
51
52         if(t==n-1) cout<<ans<<endl;
53         else cout<<"impossible"<<endl;
54         cout<<endl;
55     }
56     return 0;
57 }

错误的还未能改正好的代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5 #define N 1010
 6 #define MAXN 1000000000
 7 #define LL long long
 8 int n,M,S,T,C,count;
 9 LL ans;
10 int visit[N],d[N];
11 int map[N][N];
12
13 void prim()
14 {
15     int Min,MinIndex;
16     memset(visit,0,sizeof(visit));
17     ans=0;
18     visit[0]=1,count=1;
19     for(int i=1;i<n;i++) d[i]=map[0][i];
20
21     for(int i=0;i<n-1;i++)
22     {
23         Min=MAXN,MinIndex=1;
24
25         for(int i=1;i<n;i++)
26             if(!visit[i]&&Min>d[i])
27                 Min=d[i],MinIndex=i;
28
29         visit[MinIndex]=1;
30         if(Min<MAXN) ans+=Min,count++;//cout<<Min<<‘ ‘;
31         //cout<<ans<<endl;
32         for(int i=1;i<n;i++)
33             if(!visit[i]&&d[i]>map[i][MinIndex])
34                 d[i]=map[i][MinIndex];
35     }
36 }
37
38 int main()
39 {
40     while(scanf("%d%d",&n,&M)!=EOF){
41         if(n==0) {cout<<0<<endl;continue;}
42             //cout<<MAXN<<endl;
43         for(int i=0;i<n;i++){
44             for(int j=0;j<n;j++)
45                 map[i][j]=MAXN;
46         }
47         for(int i=0;i<M;i++)  scanf("%d%d%d",&S,&T,&C),map[S][T]=C,map[T][S]=C;;
48
49         prim();
50
51         /*for(int i=0;i<n;i++){
52             for(int j=0;j<n;j++)
53                 cout<<map[i][j]<<‘ ‘;
54             cout<<endl;
55         }*/
56
57         if(count==n) cout<<ans<<endl;
58         else cout<<"impossible"<<endl;
59         cout<<endl;
60     }
61     return 0;
62 }

HDU 2122

时间: 2024-10-15 22:22:34

HDU 2122的相关文章

hdu 2122 Ice_cream’s world III(最小生成树)

感觉就是 畅通工程的改版 直接贴代码了 #include<stdio.h> #include<string.h> #include<math.h> #include<iostream> #include<algorithm> #include<queue> #include<stack> #define mem(a,b) memset(a,b,sizeof(a)) #define ll __int64 #define MA

HDU - 2122 Ice_cream’s world III

题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=2122 最小生成树问题,可采用Kruskal算法,贪心策略,每次选取无向带权图的最短边,并把两端点用 并查集的方式添加到一个集合内. 1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 const int maxn=1000+5,maxm=10000+10; 5 int u[maxm],v[maxm

HDU 2122 HDU Today(dijkstra+map)

HDU Today Problem Description 经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强.这时候,XHD夫妇也退居了二线,并在风景秀美的诸暨市浬浦镇陶姚村买了个房子,开始安度晚年了.这样住了一段时间,徐总对当地的交通还是不太了解.有时很郁闷,想去一个地方又不知道应该乘什么公交车,在什么地方转车,在什么地方下车(其实徐总自己有车,却一定要与民同乐,这就是徐总的性格).徐总经常会问蹩脚

hdu 2122(Ice_cream’s world III)(最小生成树,两种算法都可以)

Ice_cream's world III Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 926    Accepted Submission(s): 303 Problem Description ice_cream's world becomes stronger and stronger; every road is built

HDU 2122 HDU Today【Floyd】

题意:给出n条路,起点和终点,问最短距离 用map处理一下地名,再用floyd 可是不懂的是:为什么INF定义成0x7fffffff就输出一堆奇怪的东西,改成100000000就可以了 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #include<stack> 6 #include<vector> 7 #include

hdu 2122:Ice_cream’s world III

人生第一次1A 写完即AC 艾玛高兴坏了 拉个屎冷静一下 = = #include<stdio.h> #include<string.h> #include<algorithm> #include<map> #include<math.h> #define maxn 1111 #define inf 0xfffffff using namespace std; int treedis[maxn]; int dis[maxn][maxn]; boo

HDU 2122 Ice_cream’s world III【最小生成树】

解题思路:基础的最小生成树反思:不明白为什么i从1开始取,就一直WA,难道是因为村庄的编号是从0开始的吗 Ice_cream’s world III Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1032    Accepted Submission(s): 335 Problem Description ice_cream’s wo

A - Ice_cream’s world III

Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 2122 Description ice_cream’s world becomes stronger and stronger; every road is built as undirected. The queen enjoys traveling around her world;

HDU 6203 ping ping ping [LCA,贪心,DFS序,BIT(树状数组)]

题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=6203] 题意 :给出一棵树,如果(a,b)路径上有坏点,那么(a,b)之间不联通,给出一些不联通的点对,然后判断最少有多少个坏点. 题解 :求每个点对的LCA,然后根据LCA的深度排序.从LCA最深的点对开始,如果a或者b点已经有点被标记了,那么continue,否者标记(a,b)LCA的子树每个顶点加1. #include<Bits/stdc++.h> using namespace std;