poj1751 highway

来源:互联网 发布:傅雷夫妇 死 知乎 编辑:程序博客网 时间:2024/05/21 22:53

prim算法稍加变化,看代码:

#include<iostream>#include<cstring>#include<cstdio>#include<cstdlib>#include<algorithm>using namespace std;#define maxn  1001#define inf   0xfffffffint n;   //总点数int d[maxn][maxn];//村庄图int v[maxn];//已选标记int l[maxn];//点到已选点最短路径长度int p[maxn];int x[maxn],y[maxn];        void prim(){     memset(x,0,sizeof(x));//初始化,清零    for(int i=1;i<=n;i++)    {        l[i]=d[1][i];        p[i]=1;    }    v[0]=1;    l[0]=0;              //已选(0,0)为起点    for(int i=1;i<=n;i++)    {        int m=inf,temp=0;        for(int j=0;j<=n;j++)        {            if(!v[j]&&m>l[j])            {                m=l[temp=j];                }         }               //l[temp]=0;        v[temp]=1;        if(d[p[temp]][temp]!=0)         {            printf("%d %d\n",temp,p[temp]);        }        for(int j=1;j<=n;j++){              if(!v[j]&&l[j]>d[temp][j])            {                  l[j]=d[temp][j];                  p[j]=temp;              }          }      }   } int main(){    scanf("%d",&n);    for(int i=1;i<=n;i++)    {        scanf("%d %d",&x[i],&y[i]);        for(int j=1;j<=i;j++)        {              d[i][j]=d[j][i]=(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]);          }      }     int m;    scanf("%d",&m);    int a,b;      for(int i=1;i<=m;i++)    {          scanf("%d%d",&a,&b);          d[a][b]=d[b][a]=0;      }     prim();    return 0;}
0 0
原创粉丝点击