题意:n个城市,然后把n个城市的坐标都给你,然后给你m条已经修好的道路,然后给出m个已经修好道路的城市a,b,
However, they want to guarantee that every town is highway-reachable from every other town.
他们保证任何城市都是可以通过其他城市到达的
很明显是个最小生成树问题、
最后让你输出所有需要另外加的道路连接的两个城市a b、
思路:先对所有n个城市求一遍距离、然后对已经修好道路的城市赋值为0、输出的时候要使用一下前驱数组(用来记录一个点的前驱是哪一个点)
1 #include<cmath> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 const int qq=800; 7 const int MAX=1e8; 8 int n,m,sum; 9 int map[qq][qq]; 10 int cost[qq+300]; 11 int vis[qq]; 12 int pre[qq]; 13 int x[qq],y[qq]; 14 void prim() 15 { 16 memset(vis,0,sizeof(vis)); 17 for(int i=1;i<=n;++i){ 18 cost[i]=map[1][i]; 19 pre[i]=1; //初始化前驱、因为刚开始加的1,所以将每一个点的前驱设置为1 20 } 21 vis[1]=1; 22 int minx,k; 23 for(int i=1;i<=n;++i){ 24 minx=MAX; 25 for(int j=1;j<=n;++j) 26 if(!vis[j] && cost[j]<minx) 27 minx=cost[k=j]; 28 if(map[pre[k]][k]) printf("%d %d ",pre[k],k); //当道路不存在时,输出前驱、 29 vis[k]=1; 30 for(int j=1;j<=n;++j) 31 if(map[k][j]<cost[j]){ 32 cost[j]=map[k][j]; 33 pre[j]=k; //更新前驱、 34 } 35 } 36 } 37 int main() 38 { 39 scanf("%d",&n); 40 int i,j,a,b; 41 for(i=1;i<=n;++i){ 42 scanf("%d%d",&x[i],&y[i]); 43 for(j=1;j<i;++j){ 44 if(i==j) map[i][j]=MAX; 45 else map[i][j]=map[j][i]=(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]); 46 } 47 } 48 scanf("%d",&m); 49 for(i=1;i<=m;++i){ 50 scanf("%d%d",&a,&b); 51 map[a][b]=map[b][a]=0; 52 } 53 prim(); 54 return 0; 55 }
,