916数据结构图(简易版本)

最小生成树

Prime

void Prime(int u)
{
	int i,v;
	//初始化 
	for(i=1;i<=n;i++) visit[i]=false;
	for(i=1;i<=n;i++) dist[i]=inf;
	for(i=1;i<=n;i++) dist[i]=map[u][i];
	visit[u]=true;
	for(v=0;v<n-1;v++)
	{
		int k=-1,mmin=inf;
	    for(i=1;i<=n;i++) 
		{
			if(dist[i]<mmin && visit[i]==false)  k=i,mmin=dist[i];
		}
		visit[k]=true;
		for(i=1;i<=n;i++)
		{
			if(dist[i]>map[k][i] && visit[i]==false)  dist[i]=map[k][i];
		}
	}
}

Kruskal

struct node 
{
	int from,to,w;//出发点,目的地,权重 
}e[150];
int parent[12];
bool cmp(node a,node b)
{
      return a.w<b.w;
 } 
 int find(int x)
 {
 	while(x!=parent[x])  x=parent[x];
 	return x;
 }
 bool join(int x,int y)
 {
 	int fx=find(x);
 	int fy=find(y);
 	if(fx==fy) return false;
 	else  parent[fx]=fy;return true;
 }
void Kruskal()
{
    sort(e+1,e+m+1,cmp);
	int i,j,cnt=0;cost=0;
	for(i=1;i<=n;i++) parent[i]=i;
	for(i=1;i<=m;i++)
	{
		if(join(e[i].from,e[i].to)==true)  cost+=e[i].w,cnt++;
		if(cnt==n-1) break;
	}
}

最短路径

Dijkstra

void Dijkstra(int u)
{
     int i,v;
     for(i=1;i<=n;i++) dist[i]=map[u][i];
     visit[u]=true;
     for(v=0;v<n-1;v++)
     {
         int k=-1,mmin=inf;
         for(i=1;i<=n;i++)  if(mmin>dist[i]&& visit[i]==false)  k=i,mmin=dist[i];
         visit[k]=true;
         for(i=1;i<=n;i++)
         {
         	if(dist[i]>dist[k]+map[k][i] && visit[i]==false )  dist[i]=dist[k]+map[k][i];
		 }
	 }
}

Floyd

void Floyd()
{
    int k,i,j;
    for(k=1;k<=n;k++)
    {
    	for(i=1;i<=n;i++)
    	{
    		for(j=1;j<=n;j++)
    		map[i][j]=min(map[i][j],map[i][k]+map[k][j]);
		}
	}
}

最大流

int DFS(int s, int t, int f)
{
    if(s==t)
        return f;//找到终点了,此时剩下的流量就是能获得的流量
    int i;
    for(i=1;i<=n;i++)
    {
        if(map[s][i] >0 && used[i] ==0)//从s开始找
        {
            used[i]=1;
            int d=DFS(i, t, min(f, map[s][i]));//问有没有增广路
            if(d>0)
            {
                map[s][i] -=d;
                map[i][s] +=d;
                return d;
            }
        }
    }
    return 0;
}
 
int maxflow(int s, int t)
{
    int flow=0;
    while(true)
    {
        memset(used, 0, sizeof(used));
        int f= DFS(s,t, INF);//不断找s到t的增广路
        if(f == 0)
            return flow; //找不到了就回去
        flow += f;//找到一个流量f的就赚了
    }
}
posted @ 2020-10-06 15:07  傻傻的小小豪  阅读(331)  评论(0编辑  收藏  举报