poj 1751 最小生成树

来源:互联网 发布:淘宝的推广方式有哪些 编辑:程序博客网 时间:2024/05/13 00:28

题目的大意就是现在有些已经连接在一起的边,让你在连接其他的N-M条边,让你计算出其他的各条边的情况,问题是我的答案和他那上面的有些顺序不照居然也AC了,不知道是这道题的数据弱还是什么其他的原因,神奇的一道题啊。。


#include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>using namespace std;#define INF 10000000struct point{   int x, y;};point city[755],_city[755];int N, M;int _min;int arcs[755][755];bool vis[755];int dist[755],disnode[755];int compare(point a, point b){  return a.x<b.x;}int dis(point p0, point p1){    return ((p0.x-p1.x)*(p0.x-p1.x) + (p0.y-p1.y)*(p0.y-p1.y)); }int prim(){    scanf("%d",&N);    for(int i=1; i<=N; i++)    scanf("%d %d",&city[i].x, &city[i].y);    for(int i=1; i<=N; i++)    for(int j=i; j<=N; j++)    {      arcs[i][j] = arcs[j][i] = dis(city[i],city[j]);     // printf("%d ",arcs[i][j]);    }    int a, b, rec;    memset(vis,false,sizeof(vis));      scanf("%d",&M);    for(int i=1; i<=M; i++)    {    scanf("%d %d", &a, &b);     arcs[a][b] = arcs[b][a] = 0;      }    for(int i=1; i<=N; i++)    {      dist[i] = arcs[1][i];      disnode[i] = 1;    }    vis[1] = true; int t=0;    for(int i=2; i<=N; i++)    {       _min = INF;       rec = 0;       for(int j=1; j<=N; j++)       if(!vis[j]&&dist[j]<_min)       {          _min = dist[j];          rec = j;       }       vis[rec] = true;      if(_min != 0)      {      //  printf("%d %d\n", disnode[rec], rec);      if(disnode[rec]<rec)       {        _city[t].x = disnode[rec];        _city[t].y = rec;       }              else       {        _city[t].x = rec;        _city[t].y = disnode[rec];       }       t++;      }       for(int j=1; j<=N; j++)       if(!vis[j]&&dist[j]>arcs[rec][j])       {       dist[j] = arcs[rec][j];       disnode[j] = rec;       }    }  return t;  }int main(){int n = prim();sort(_city,_city+n,compare);for(int i=0; i<n; i++)printf("%d %d\n",_city[i].x, _city[i].y);system("pause");return 0;}