题意:找出一条路是所有岛都联通,如果找不到就输出oh!。
解题思路:本体用的是Prim算法,模板里面加一个for判断是否存在一条路能走完所有岛。在输入时判断两个岛之间的距离。


#include <iostream> #include <cmath> using namespace std; #define INF 0x3fffffff #define MAX 100+10 double map[MAX][MAX]; int used[MAX]; double dis[MAX]; double sum; int n; int type; struct node { double i; double j; }; void Prim(int start) { memset(used,0,sizeof(used)); for(int i=1;i<=n;i++) { dis[i]=INF; } dis[start]=0; for(i=1;i<=n;i++) { double Min=INF; int index; for(int j=1;j<=n;j++) { if(!used[j]&&Min>dis[j]) { Min=dis[j]; index=j; } } sum+=dis[index]; used[index]=1; for(j=1;j<=n;j++) { if(dis[j]>map[index][j]&&map[index][j]!=-1) { dis[j]=map[index][j]; } } } for(i=1;i<=n;i++)//判断是否每个点都遍历了。是否每个岛都有路可走 { if(!used[i]) { type=1; } } return; } int main() { int m; while(~scanf("%d",&m)) { while(m--) { node step[MAX]; type=0; scanf("%d",&n); memset(map,-1,sizeof(map)); for(int i=1;i<=n;i++)//输入坐标 { scanf("%lf%lf",&step[i].i,&step[i].j); } double k=0; for(i=1;i<=n;i++) { for(int j=1;j<=n;j++) { k=sqrt((step[i].i-step[j].i)*(step[i].i-step[j].i)+(step[i].j-step[j].j)*(step[i].j-step[j].j)); if(k>=10&&k<1000)//判断两个岛之间是否大于10&&小于1000 { map[i][j]=map[j][i]=k; } } } sum=0; Prim(1); if(type) { printf("oh!\n"); continue; } printf("%.1lf\n",sum*100); } } return 0; }