最小生成树记路径

来源:互联网 发布:电话轰炸机软件免费版 编辑:程序博客网 时间:2024/05/23 02:06
#include<string.h>#include<stdio.h>  #include<string>  #include<iostream> #include<algorithm> using namespace std;  const int inf=0xffffff;  int a[1005][1005],vis[1005],d[1005],n,m,w,pre[1005]; struct node{int x,y; }f1[10005];bool cmp(node a,node b){if(a.x==b.x) return a.y<b.y;else return a.x<b.x;}int l;int prime()    {        int sum=0,i,j,k,v,ans=0;        for(i=1;i<=n;i++)        {            int u=0,min=inf;            for(j=1;j<=n;j++)            {                if(vis[j]==0&&d[j]<min)                {                    u=j;                    min=d[j];                }            }      ans+=d[u];        vis[u]=1;    if(a[u][pre[u]]!=inf)//记路径    {     f1[l].x=pre[u];     f1[l].y=u;     l++;    }    for(v=1;v<=n;v++)        {            if(vis[v]==0&&a[u][v]!=inf&&a[u][v]<d[v])            {                d[v]=a[u][v];    pre[v]=u;//路径            }        }    }    return ans;    }int main(){int u,v,f,i;while(~scanf("%d%d",&n,&m)){     l=0;     if(n==0)     break;    memset(vis,0,sizeof(vis));          fill(a[0],a[0]+1005*1005,inf);          fill(d,d+1005,inf);          d[1]=0;  for(i=1;i<=m;i++){scanf("%d%d%d",&u,&v,&f);a[u][v]=f;a[v][u]=f;}int p=prime();sort(f1,f1+l,cmp);for(i=0;i<l;i++){printf("%d %d\n",f1[i].x,f1[i].y);}}}    

原创粉丝点击