首页 > 代码库 > 洛谷1294高手去散步

洛谷1294高手去散步

本题是深度优先搜索,咱开数组被D掉了,还是乖乖用struct乱搞。

之前的数组就是暴力,对了一半,但在一个地方wa了。

看了好久,代码变成一坨,就像这样:

 1 for(int i=1;i<=n;i++){
 2         int hh=1,hhh=1;int last=0;
 3         memset(c,0,sizeof(c));
 4         for(int k=1;k<=n;k++){int max=0;
 5             for(int j=1;j<=n;j++){
 6                 if(b[i][j]==1 && max<a[i][j] && c[j]==0){
 7                     hh=i;hhh=j;max=a[i][j];c[i]=1;c[j]=1;
 8                 }
 9             }
10             if(last!=max){ans[i]+=max;last=max;}
11         }
12     }

然后我就果断的放弃。

新的是这样:

#include <iostream>
#include <cstring>
using namespace std;
struct edge
{
    int v,w,next;
}a[101];
int link[21],n,m;
bool v[21];
void add(int x,int y,int w)
{
    static int p=0;
    p++;
    a[p].v=y;
    a[p].w=w;
    a[p].next=link[x];
    link[x]=p;
}
int dfs(int x)
{
    if(v[x])return 0;
    int ans=0;
    v[x]=true;
    for(int i=link[x];i!=0;i=a[i].next)
        if(v[a[i].v]==0)
            ans=max(ans,dfs(a[i].v)+a[i].w);
    v[x]=false;
    return ans;
}
int main()
{
    int x,y,w,ans=0;
    cin >> n >> m;
    for(int i=1;i<=m;i++)
    {
        cin >> x >> y >> w;
        add(x,y,w);
        add(y,x,w);
    }
    for(int i=1;i<=n;i++)
    {
        memset(v,0,sizeof(v));
        ans=max(ans,dfs(i));
    }
    cout << ans << endl;
    return 0;
}

 个人感觉,暴力还是挺不错的,可以用来刷水题

洛谷1294高手去散步