花生闽南叫土豆吧 关注:4贴子:98
  • 1回复贴,共1
最小生成树 prim
#include<stdio.h>
int t,n,result=-1;
int dis[510][510];
int lowcost[510],adjvex[510];
int prim();
int min_n();
int main()
{
     scanf("%d",&t);
     while(t--)
     {
        result=0;
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
           for(int j=0;j<n;j++)
           {
              scanf("%d",&dis[i][j]);
           }
        }
        prim();
        printf("%d\n",result);
     }
}
int prim()
{
     for(int i=0;i<n;i++)
     {
        lowcost[i]=dis[0][i];
        adjvex[i]=0;
     }
     for(int j=1;j<n;j++)
     {
        int k;
        k=min_n();
        if(result<lowcost[k]) result=lowcost[k]; //求最小生成树里的最大边
        lowcost[k]=0;
        for(int l=1;l<n;l++)
        {
           if(dis[k][l]<lowcost[l])
           {
              lowcost[l]=dis[k][l];
              adjvex[l]=k;
           }
        }
     }
}
int min_n()
{
     int k,d=999999999;
     for(int i=1;i<n;i++)
     {
        if(lowcost[i]!=0&&lowcost[i]<d)
        {
           d=lowcost[i];
           k=i;
        }
     }
     return k;
}


IP属地:福建1楼2010-10-08 10:03回复
    单源最短路径 Dijkstra 很多小细节需要注意!!!!!
    poj 3268
    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    using namespace std;
    int n,m,x;
    int map[1010][1010];
    int r_map[1010][1010];
    int dis[1010],dis_f[1010];
    int cow[1010];
    int dijkstra(int s,int s_map[1010][1010]);
    int min_n();
    int main()
    {
         scanf("%d%d%d",&n,&m,&x);
         memset(map,1,sizeof(map));
         memset(r_map,1,sizeof(r_map));
         memset(cow,0,sizeof(cow));
         for(int i=0;i<n;i++)
         {
            map[i][i]=0;
            r_map[i][i]=0;
         }
         for(int j=0;j<m;j++)
         {
            int a,b,t;
            scanf("%d%d%d",&a,&b,&t);
            map[a][b]=t;
            r_map[b][a]=t;
         }
         dijkstra(x,map);
         for(int k=1;k<=n;k++) cow[k]=dis_f[k];
         dijkstra(x,r_map);
         int max_cow=-1;
         for(int l=1;l<=n;l++)
         {
             cow[l]+=dis_f[l];
             if(max_cow<cow[l]) max_cow=cow[l];
         }
         printf("%d\n",max_cow);
    }
    int dijkstra(int s,int map[1010][1010])
    {
         dis_f[s]=0;
         for(int i=1;i<=n;i++)
         {
            dis[i]=map[s][i];
         }
         for(int j=1;j<n;j++)
         {
            int k;
            k=min_n();
            dis_f[k]=dis[k];
            dis[k]=0;
            for(int l=1;l<=n;l++)
            {
               if(dis[l]!=0&&dis[l]>dis_f[k]+map[k][l])
               {
                  dis[l]=dis_f[k]+map[k][l];
               }
            }
         }
    }
    int min_n()
    {
         int k,d=16843009;
         for(int i=1;i<=n;i++)
         {
            if(dis[i]!=0&&dis[i]<d)
            {
               d=dis[i];
               k=i;
            }
         }
         return k;
    }
    


    IP属地:福建2楼2010-10-08 12:14
    回复