• 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的就赚了
        }
    }
    
  • 相关阅读:
    app ios info权限配置:
    ionic3 小记录
    mipush ionic3 线上push
    ionic3 生命周期 之 ionViewWillLeave 坑
    iphone X 底部留白 之 ionic3 项目
    微信小程序 修改手机状态栏颜色
    git 命令
    微信小程序 下拉加载
    js 判断浏览器型号
    关于 ionic3 tabs 导航ico 点击 页面返回顶部
  • 原文地址:https://www.cnblogs.com/xxhao/p/13773456.html
Copyright © 2020-2023  润新知