1 条题解

  • 0
    @ 2025-5-20 10:36:53
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <vector>
    using namespace std;
    int b[25];
    int map[25][25];
    int a[25][25];
    int st,en;
    int n,m;
    int len,cnt;
    struct point
    {
        int path[25];
        int length;
    };
    bool vis[25];
    vector<point> v;
    void dfs(int x,point p,int l)
    {
        if(x==en)
        {
            v.push_back(p);
            return;
        }
        for(int i=1; i<=a[x][0]; i++)
        if(!vis[a[x][i]]&&l+map[x][a[x][i]]<=len)
        {
            vis[a[x][i]] = 1;
            p.length+=map[x][a[x][i]];
            p.path[++p.path[0]] = a[x][i];
            dfs(a[x][i],p,l+map[x][a[x][i]]);
            p.path[0]--;
            p.length-=map[x][a[x][i]];
            vis[a[x][i]] = 0;
        }
    }
    int cmp(const point &a,const point b)
    {
        if(a.length==b.length)
        {
            for(int i=1; i<=a.path[0]&&i<=b.path[0]; i++)
            if(a.path[i]==b.path[i]) continue;
            else return a.path[i]<b.path[i];
        }
        return a.length<b.length;
    }
    int main()
    {
        int cas = 0;
        while(scanf("%d",&n)&&n>0)
        {
            scanf("%d",&m);
            memset(map,0,sizeof(map));
            memset(a,0,sizeof(a));
            while(m--)
            {
                int x,y,z;
                scanf("%d%d%d",&x,&y,&z);
                map[x][y] = map[y][x] = z;
                a[x][++a[x][0]] = y;
                a[y][++a[y][0]] = x;
            }
            scanf("%d%d",&st,&en);
            scanf("%d",&len);
            point p;
            p.length = 0;
            p.path[0] = 1;
            p.path[1] = 1;
            memset(vis,0,sizeof(vis));
            vis[1] = 1;
            dfs(1,p,0);
            if(cas) puts("");
            printf("Case %d:\n",++cas);
            int size = v.size();
            if(size==0)
            {
                printf(" NO ACCEPTABLE TOURS\n");
                continue;
            }
            sort(v.begin(),v.end(),cmp);
            for(int i=0; i<size; i++)
            {
                point tmp = v[i];
                printf(" %d:",tmp.length);
                for(int j=1; j<=tmp.path[0]; j++)
                printf(" %d",tmp.path[j]);
                puts("");
            }
            v.clear();
        }
        return 0;
    }
    
    • 1

    信息

    ID
    1198
    时间
    10000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    11
    已通过
    1
    上传者