poj2531(dfs)Network Saboteur

来源:互联网 发布:linux命令的压缩和解压 编辑:程序博客网 时间:2024/06/05 17:09

poj2531

看到这个题分类在dfs里,但是完全没有思路。。。

看了下别人的博客。。

先将所有点放在一个集合里,然后取出一个点放在另一个集合里,对于在同一个集合里的点,减去他们两个之间的权

值,对于不在一个集合里的点,加上他们之间的权值。

#include<cstdio>#include<iostream>#include<cstring>using namespace std;bool vis[25];int n;int mp[25][25];int Max;void dfs(int st,int sum){    int sum1=sum;    vis[st]=1;    for(int i=0;i<n;i++)    {        if(vis[i])            sum1=sum1-mp[st][i];//i与st在用一个集合加上两点间的权        else            sum1=sum1+mp[st][i];//i与st在不同集合减去两点间的权    }    if(sum1>Max)        Max=sum1;//Max记录最大值    for(int i=st+1;i<n;i++)    {            dfs(i,sum1);            vis[i]=0;//回溯    }}int main(){    while(~scanf("%d",&n))    {        memset(mp,0,sizeof(mp));        memset(vis,0,sizeof(vis));        for(int i=0;i<n;i++)            for(int j=0;j<n;j++)                scanf("%d",&mp[i][j]);            Max=-99999999;            dfs(0,0);            printf("%d\n",Max);    }    return 0;}