zoukankan      html  css  js  c++  java
  • poj2531

    看了一下0ms,16ms,100ms左右过了的代码,思维量对我来说比較大,不是非常easy理解。

    我的作法:

    用并查集算权值和。

    用dfs枚举两个点集的全部可能,因为是全然图,枚举一半的点就可以。

    #include<iostream>
    #include<cstring>
    using namespace std;
    int map[30][30],N,vis[30],MAX;
    void getdate()
    {
    	int i,j;
    	scanf("%d",&N);
    	for(i=0;i<N;i++)
    		for(j=0;j<N;j++)
    			scanf("%d",&map[i][j]);
    }
    void dfs(int start,int v2)
    {
    	int i,j,sum;
    	if(v2==0)
    	{
    		sum=0;
    		for(i=0;i<N;i++)
    			if(vis[i]==1)
    				for(j=0;j<N;j++)
    					if(vis[j]==0)
    						sum+=map[i][j];
    		MAX=max(MAX,sum);
    		return;
    	}
    	for(i=start;i<N&&i+v2<=N;i++)
    		if(vis[i]==0)
    		{
    			vis[i]=1;
    			dfs(i+1,v2-1);
    			vis[i]=0;
    		}
    }
    void solve()
    {
    	int i,m;
    	getdate();
    	m=N/2;
    	MAX=-1;
    	memset(vis,0,sizeof(vis));
    	for(i=1;i<=m;i++)
    		dfs(0,i);
    	printf("%d
    ",MAX);
    }
    int main()
    {
    	solve();
    }


  • 相关阅读:
    java中的Class类
    装机
    CSS入门
    初级HTML
    IO加强
    Lambda表达式
    IOStream-基础
    JavaSE阶段基础内容(不包括I/O,常用类,集合)
    markdown学习
    Log4j配置详解
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/3904672.html
Copyright © 2011-2022 走看看