畅通工程汇总
来源:互联网 发布:淘宝刷单是真是假 编辑:程序博客网 时间:2024/06/08 16:38
1:Problem Description
Input
注意:两个城市之间可以有多条道路相通,也就是说
3 3
1 2
1 2
2 1
这种输入也是合法的
当N为0时,输入结束,该用例不被处理。
Output
Sample Input
4 21 34 33 31 21 32 35 21 23 5999 00
Sample Output
102998
#include<stdio.h>#include<string.h> int p[11010]; int find(int x) { if(p[x]==x) return x; else return p[x]=find(p[x]); } void Union(int x,int y) { int f1=find(x); int f2=find(y); p[f1]=f2; } int main() { int n,m; int a,b; int sum; int i,j,k,l; while(scanf("%d",&n),n) { scanf("%d",&m); memset(p,0,sizeof(p)); for(i=1;i<=n;i++) p[i]=i; for(j=0;j<m;j++) { scanf("%d%d",&a,&b); Union(a,b); } sum=-1; for(j=1;j<=n;j++) { if(p[j]==j) sum++; } printf("%d\n",sum); } return 0; }
2:Problem Description
某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
Input
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
当N为0时,输入结束,该用例不被处理。
Output
对每个测试用例,在1行里输出最小的公路总长度。
Sample Input
31 2 11 3 22 3 441 2 11 3 41 4 12 3 32 4 23 4 50
Sample Output
35
#include<stdio.h>#include<algorithm>#include<string.h> int p[11010]; using namespace std; struct information { int num1; int num2; int dis; }boy[11010]; int cmp(information a,information b) { return a.dis<b.dis; } int find(int x) { return p[x]==x?x:find(p[x]); } int main() { int n,m; int a,b; int sum; int i,j,k,l; int f1,f2; while(scanf("%d",&n),n) { memset(p,0,sizeof(p)); m=n*(n-1)/2; for(i=1;i<=n;i++) p[i]=i; for(j=0;j<m;j++) { scanf("%d%d%d",&boy[j].num1,&boy[j].num2,&boy[j].dis); } sort(boy,boy+m,cmp); sum=0; for(j=0;j<m;j++) {f1=find(boy[j].num1); f2=find(boy[j].num2); if(f1!=f2) { p[f1]=f2; sum+=boy[j].dis; } } printf("%d\n",sum); } return 0; }
3:Problem Description
省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本。现请你编写程序,计算出全省畅通需要的最低成本。
Input
测试输入包含若干测试用例。每个测试用例的第1行给出评估的道路条数 N、村庄数目M ( < 100 );随后的 N
行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间道路的成本(也是正整数)。为简单起见,村庄从1到M编号。当N为0时,全部输入结束,相应的结果不要输出。
Output
对每个测试用例,在1行里输出全省畅通需要的最低成本。若统计数据不足以保证畅通,则输出“?”。
Sample Input
3 31 2 11 3 22 3 41 32 3 20 100
Sample Output
3?
#include<stdio.h>#include<algorithm>#include<string.h>using namespace std; int p[10010]; struct information { int num1; int num2; int dis; } boy[10010]; int cmp(information a,information b) { return a.dis<b.dis; } int find( int x) { return p[x]==x?x:find(p[x]); } int main() { int m,n; int f1,f2; int i,j,k,l; int sum; while(scanf("%d%d",&m,&n),m) { memset(p,0,sizeof(p)); for(i=1;i<=n;i++) p[i]=i; for(j=0;j<m;j++) scanf("%d%d%d",&boy[j].num1,&boy[j].num2,&boy[j].dis); sort(boy,boy+m,cmp); k=1; sum=0; for(i=0;i<m;i++) { f1=find(boy[i].num1);f2=find(boy[i].num2); if(f1!=f2) { sum+=boy[i].dis; p[f1]=f2; k++; } } if(k==n) //是否将n个村庄联通 printf("%d\n",sum); else printf("?\n"); } return 0; }
4:Problem Description
某省自从实行了很多年的畅通工程计划后,终于修建了很多路。不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多。这让行人很困扰。
现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。
Input
本题目包含多组数据,请处理到文件结束。
每组数据第一行包含两个正整数N和M(0<N<200,0<M<1000),分别代表现有城镇的数目和已修建的道路的数目。城镇分别以0~N-1编号。
接下来是M行道路信息。每一行有三个整数A,B,X(0<=A,B<N,A!=B,0<X<10000),表示城镇A和城镇B之间有一条长度为X的双向道路。
再接下一行有两个整数S,T(0<=S,T<N),分别代表起点和终点。
Output
对于每组数据,请在一行里输出最短需要行走的距离。如果不存在从S到T的路线,就输出-1.
Sample Input
3 30 1 10 2 31 2 10 23 10 1 11 2
Sample Output
2-1
#include<stdio.h>#define Max 10000000 int map[200][200]; void floyd(int n) { int i,j,k; for(i=0;i<n;i++) for(j=0;j<n;j++) for(k=0;k<n;k++) if(map[j][i]+map[i][k]<map[j][k]) map[j][k]=map[j][i]+map[i][k]; } int main() { int n,m; int i,j,k,l; int from,distination,dis; while(scanf("%d%d",&n,&m)!=EOF) { for(i=0;i<200;i++) for(j=0;j<200;j++) map[i][j]=Max; for(i=0;i<200;i++) map[i][i]=0; for(i=0;i<m;i++) { scanf("%d%d%d",&from,&distination,&dis); if(dis<map[from][distination])//此处将权付新值 { map[from][distination]=dis; map[distination][from]=dis; } } floyd(n); scanf("%d%d",&from,&distination); if(map[from][distination]==Max) printf("-1\n"); else printf("%d\n",map[from][distination]); } return 0; }
5:Problem Description
相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现。现在政府决定大力发展百岛湖,发展首先要解决的问题当然是交通问题,政府决定实现百岛湖的全畅通!经过考察小组RPRush对百岛湖的情况充分了解后,决定在符合条件的小岛间建上桥,所谓符合条件,就是2个小岛之间的距离不能小于10米,也不能大于1000米。当然,为了节省资金,只要求实现任意2个小岛之间有路通即可。其中桥的价格为 100元/米。
Input
输入包括多组数据。输入首先包括一个整数T(T <= 200),代表有T组数据。
每组数据首先是一个整数C(C <= 100),代表小岛的个数,接下来是C组坐标,代表每个小岛的坐标,这些坐标都是 0 <= x, y <= 1000的整数。
Output
每组输入数据输出一行,代表建桥的最小花费,结果保留一位小数。如果无法实现工程以达到全部畅通,输出”oh!”.
Sample Input
2210 1020 2031 12 21000 1000
Sample Output
1414.2oh!
#include<stdio.h>#include<math.h>#include<algorithm>#include<string.h> using namespace std; int p[10010]; struct information { int num1; int num2; double dis; }boy[10010]; int find(int x) { return p[x]==x?x:find(p[x]); } int cmp(information a,information b) { return a.dis<b.dis; } double distance(int a,int b,int c,int d) { double dis=0; dis=sqrt((a-c)*(a-c)*1.0+(b-d)*(b-d)*1.0); return dis; } int main() { int T; int c; int x[110],y[110]; int i,j,k,l; int f1,f2; double t,sum; scanf("%d",&T); while(T--) { memset(p,0,sizeof(p)); scanf("%d",&c); for(j=1;j<=c;j++) p[j]=j; for(i=1;i<=c;i++) scanf("%d%d",&x[i],&y[i]); k=1;for(i=1;i<c;i++) for(j=i+1;j<=c;j++) { t=distance(x[i],y[i],x[j],y[j]); // printf("---%lf\n",t); if(t>=10&&t<=1000) { boy[k].num1=i; boy[k].num2=j; boy[k++].dis=t; } } //printf("--%d\n",k);sort(boy+1,boy+k,cmp); sum=0; l=1; for(i=1;i<=k-1;i++) { f1=find(boy[i].num1); f2=find(boy[i].num2); if(f1!=f2) { l++; sum+=boy[i].dis; p[f1]=f2; } } if(l==c)printf("%.1lf\n",sum*100); else printf("oh!\n"); } return 0; }
6:Problem Description
Input
当N为0时输入结束。
Output
Sample Input
31 2 1 01 3 2 02 3 4 031 2 1 01 3 2 02 3 4 131 2 1 01 3 2 12 3 4 10
Sample Output
310
#include<stdio.h>#include<algorithm>#include<string.h>using namespace std; int p[10010]; struct information { int num1; int num2; int dis; int condition; } boy[10010]; int cmp(information a,information b) { return a.dis<b.dis; } int find( int x) { return p[x]==x?x:find(p[x]); } int main() { int m,n; int f1,f2; int i,j,k,l; int sum; while(scanf("%d",&n),n) { m=n*(n-1)/2; memset(p,0,sizeof(p)); for(i=1;i<=n;i++) p[i]=i; for(j=0;j<m;j++) scanf("%d%d%d%d",&boy[j].num1,&boy[j].num2,&boy[j].dis,&boy[j].condition); sort(boy,boy+m,cmp); // k=1; sum=0; for(i=0;i<m;i++) { if(boy[i].condition==1) { //sum+=boy[i].dis; f1=find(boy[i].num1); f2=find(boy[i].num2); p[f1]=f2; // k++; } } for(j=0;j<m;j++) { f1=find(boy[j].num1); f2=find(boy[j].num2); if(f1!=f2) { sum+=boy[j].dis; p[f1]=f2; } } // if(k==n) //是否将n个村庄联通 printf("%d\n",sum); //else // printf("?\n"); } return 0; }
- 畅通工程汇总
- 畅通工程
- 畅通工程
- 畅通工程
- 畅通工程
- 畅通工程
- 畅通工程
- 畅通工程
- 畅通工程
- 畅通工程
- 畅通工程
- 畅通工程
- 畅通工程
- 畅通工程
- 畅通工程
- 畅通工程
- 畅通工程
- 畅通工程
- margin和padding
- 让风吹进度计划方便
- PHP session有效期session.gc_maxlifetime
- 关于连接数据库字符串
- 让风吹进度计划方便
- 畅通工程汇总
- host元素的属性autoDeploy和reloadable的区别
- HttpSession
- Ubuntu gedit 打开txt乱码问题
- 安装qt-embedded-linux-opensource-src-4.4.0
- 关于STM8的时钟源配置
- android设备休眠
- 奇异值分解及其应用(转自http://leftnoteasy.cnblogs.com)
- Fedora窗口最大最小化