您的位置:首页 > 其它

USACO:Agri-Net解题报告

2011-03-18 14:22 351 查看
思路:最小生成树,prim算法解.

 

 

/*

ID: xpli1

PROG: agrinet

LANG: C

*/

#include <stdio.h>

#include <math.h>

#include <ctype.h>

#define max(a,b) (((a) > (b)) ? (a) : (b))

#define min(a,b) (((a) < (b)) ? (a) : (b))

#define INT_MAX 0x7fffffff

#define IN stdin

#define OUT stdout

int weight[101][101];

int distance[101];

int source[101];

int intree[101];

int N,treesize,treecost;

void prim()

{

 int i,j,k;

 for(i=0; i<N; i++){

  distance[i] = INT_MAX;

  source[i] = -1;

  intree[i] = 0;

 }

 treesize  = 1;

 treecost  = 0;

 intree[0] = 1;

 for(i=1; i<N; i++){

  distance[i] = weight[0][i];

  source[i] =  0;

 }

 while(treesize < N){

  int MIN = INT_MAX;

  for(j=0; j<N; j++){

   if(!intree[j] && MIN > distance[j]){

    k = j;

    MIN = distance[k];

   }

  }

  treesize++;

  treecost += distance[k];

  intree[k] = 1;

  for(j=0; j<N; j++){

   if(!intree[j] && distance[j] > weight[k][j]){

    distance[j] = weight[k][j];

    source[j] = k;

   }

  }

 }

 return;

}

int main(void)

{

 FILE* fin = fopen("agrinet.in","r");

 FILE* fout = fopen("agrinet.out","w");

 fscanf(IN,"%d",&N);

 int i=0;

 while(i<N*N) {fscanf(IN,"%d",&weight[i/N][i%N]); i++;}

 prim();

 fprintf(OUT,"%d/n",treecost);

 return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  distance file 算法 c