1.Dijkstra算法
#include<stdio.h>
#include<iostream>
#define Max 999999
int map[1005][1005];
int dis[1005];
void dijkstra(int n)
{
int visit[1001]={0};
int min,i,j,k;
visit[1]=1;
for(i=1;i<n;++i)
{
min=Max;
k=1;
for(j=1;j<=n;++j)
{
if(!visit[j]&&min>dis[j])
{
min=dis[j];
k=j;
}
}
visit[k]=1;
for(j=1;j<=n;++j)
{
if(!visit[j]&&dis[j]>dis[k]+map[k][j])
dis[j]=dis[k]+map[k][j];
}
}
printf("%d\n",dis[n]);
}
int main()
{
int t,n,i,j,from,to,cost;
while(scanf("%d%d",&t,&n)!=EOF)
{
for(i=1;i<=n;++i)
{
map[i][i]=0;
for(j=1;j<i;++j)
map[i][j]=map[j][i]=Max;
}
for(i=1;i<=t;++i)
{
scanf("%d%d%d",&from,&to,&cost);
if(cost<map[from][to])
map[from][to]=map[to][from]=cost;
}
for(i=1;i<=n;++i)
dis[i]=map[1][i];
dijkstra(n);
}
return 0;
}
2.Kruskal算法
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m;
int f[10005],sum,cou;
struct edge
{
int u;
int v;
int w;
};
edge e[10005];
int cmp(edge a,edge b)
{
return a.w<b.w;
}
int getf(int v)
{
if(f[v]==v)
return v;
else
{
f[v]=getf(f[v]);
return f[v];
}
}
int merg(int v,int u)
{
int t1,t2;
t1=getf(v);
t2=getf(u);
if(t1!=t2)
{
f[t2]=t1;
return 1;
}
return 0;
}
int main()
{
int i;
while(scanf("%d%d",&n,&m)!=EOF)
{
sum=0;
cou=0;
memset(e,0,sizeof(e));
memset(f,0,sizeof(f));
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
}
sort(e+1,e+m+1,cmp);
for(i=1;i<=n;i++)
{
f[i]=i;
}
for(i=1;i<=m;i++)
{
if(merg(e[i].v,e[i].u))
{
cou++;
sum=sum+e[i].w;
}
if(cou==n-1)
break;
}
cout<<sum<<endl;
}
return 0;
}
3.Prim算法
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int n,m;
int i,j,k;
int t1,t2,t3;
int minx;
int e[105][105],dis[105],book[105];
int inf=99999999;
int cou,sum;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(e,0,sizeof(e));
memset(dis,0,sizeof(dis));
memset(book,0,sizeof(book));
sum=0;
cou=0;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(i==j)
e[i][j]=0;
else
e[i][j]=inf;
}
}
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&t1,&t2,&t3);
e[t1][t2]=t3;
e[t2][t1]=t3;
}
for(i=1;i<=n;i++)
{
dis[i]=e[1][i];
}
book[1]=1;
cou++;
while(cou<n)
{
minx=inf;
for(i=1;i<=n;i++)
{
if(book[i]==0&&dis[i]<minx)
{
minx=dis[i];
j=i;
}
}
book[j]=1;
cou++;
sum=sum+dis[j];
for(k=1;k<=n;k++)
{
if(book[k]==0&&dis[k]>e[j][k])
dis[k]=e[j][k];
}
}
cout<<sum<<endl;
}
return 0;
}