另外再补充一个Kruskal算法,这是偶去年准备的,此外图论的算法还有很多,比如网络流算法
二分图匹配算法,更深的有偶今年3月用半个月写的TSP的遗传算法。图论很多问题都有很好的模型可以解决。所以碰到图论问题,很多时候会有很基础的算法可以借鉴,但是竞赛的时候更多的是加入一些限制条件,在这种情况下,就应当头脑中清楚这些算法的推导过程,知道本质才能应用的游刃有余。
/*
Author: dcyu
Date: 2002-09-11
*/
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int Max(int a,int b)
{
return a>b?a:b;
}
int Min(int a,int b)
{
return a<b?a:b;
}
void main()
{
float data[20][3] = {{1, 2, 10}, {1, 3, 9.8}, {1, 5, 7.0}, {1, 9, 3.7}, {2, 4, 5.7},
{2, 6, 6}, {2, 10, 10.0}, {3, 4, 3.5}, {3, 6, 7.7}, {3, 8, 8.8}, {3, 10, 4},
{4, 6, 12}, {4, 7, 13}, {4, 8, 3.9}, {5, 6, 4.9}, {5, 8, 4.5}, {6, 9, 1.8},
{7, 10, 12}, {8, 9, 9}, {9, 10, 20.0}};
int i,j,k,m,n=20,v=10;
int flag[11],tree[20];
int min,max;
float t,tt;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(data[j][2]<data[k][2]) k=j;
if(k!=i)
for(m=0;m<=1;m++)
{ tt=data[m]; data[m]=data[k][m]; data[k][m]=tt; }
t=data[2]; data[2]=data[k][2]; data[k][2]=t;
}
system("cls");
printf("Graph:\n");
j=0;
for(i=0;i<n;i++)
{
j++;
printf("%2d: %2d ---- %2d %8.2f\n",j,(int)data[0],(int)data[1],data[2]);
}
for(i=0;i<v;i++)
flag=i;
for(i=0;i<n;i++)
tree=0;
for(i=0;i<n;i++)
{
if(flag[(int)data[0]]!=flag[(int)data[1]])
{
tree=1;
max=Max(flag[(int)data[0]],flag[(int)data[1]]);
min=Min(flag[(int)data[0]],flag[(int)data[1]]);
for(j=1;j<=v;j++)
if(flag[j]==max)
flag[j]=min;
}
}
printf("Kruskal MiniSpanTree:\n");
j=0;
for(i=0;i<n;i++)
if(tree)
{
j++;
printf("%d: %2d ---- %2d %8.2f\n",j,(int)data[0],(int)data[1],data[2]);
}
}
|