UESTC889&&uvalive6623 Battle for Silver(dfs)

来源:互联网 发布:json.parse 源码 编辑:程序博客网 时间:2024/05/18 01:00

题意:要选取一个集合,每两个点都有直接连接,且连线不交叉,求集合的最大权值。

关键在于选取的集合每两个点之间直连,且连线不交叉,可证明最多四个点,裸搜索

代码:

#include<iostream>#include<cmath>#include<queue>#include<set>#include<cstdio>#include<cstring>#include<algorithm>#define LL long long#define MOD 100000007#define INF 0x3f3f3f3fusing namespace std;const int maxn=500;const int maxm=1000;int n,ans,da[maxn],done[maxn],p[maxn];bool g[maxn][maxn];bool is_ill(int place,int x){    for(int i=0;i<place;i++)        if(!g[p[i]][x])return 1;    return 0;}void dfs(int place,int last,int sum){    ans=max(ans,sum);    if(place==4)return ;    for(int i=last+1;i<=n;i++)    if(!done[i]&&!is_ill(place,i)){        done[i]=1;        p[place]=i;        dfs(place+1,i,sum+da[i]);        done[i]=0;    }}int main(){    int m,a,b,i,j,k;    while(~scanf("%d%d",&n,&m))    {        for(i=1;i<=n;i++)            scanf("%d",&da[i]);        memset(g,0,sizeof g);        for(i=0;i<m;i++)        {            scanf("%d%d",&a,&b);            g[a][b]=g[b][a]=1;        }        ans=0;        dfs(0,0,0);        printf("%d\n",ans);    }    return 0;}



0 0
原创粉丝点击