1 条题解

  • 0
    @ 2025-4-22 12:50:09

    这题的题意就是给你n个城镇,有些城镇围成了一块区域,每个区域的边界都是用墙分隔的,一些人在一些城镇出发在某一个区域里见面,但是不能在某个城镇里。问穿过墙的最少数量是多少。题目给出的是每个区域包含的城镇,建图以后跑floyd就求出任意两区域,然后枚举一下就能得到答案了。

    #include <iostream>
    #include <cstdio>
    #include <string.h>
    #include <map>
    #include <vector>
    using namespace std;
    int n,m,club[300];
    int town[300];
    map<int,int> exist;
    int dis[300][300];
    vector<int> region[300];
    void floyd()
    {
        for(int k=1;k<=m;k++)
        for(int i=1;i<=m;i++)
        for(int j=1;j<=m;j++)
        {
            if(dis[i][j]>dis[i][k]+dis[k][j])
                dis[i][j]=dis[i][k]+dis[k][j];
        }
    }
    int main()
    {
        //freopen("input.txt","r",stdin);
        while(scanf("%d",&m)!=EOF)
        {
            int ans=100000000;
            memset(dis,63,sizeof(dis));
            for(int i=1;i<=m;i++)
                dis[i][i]=0;
            exist.clear();
            scanf("%d",&n);
            int num;
            scanf("%d",&num);
            for(int i=0;i<num;i++)
                scanf("%d",&club[i]);
            for(int i=1;i<=n;i++)
                region[i].clear();
            for(int area=1;area<=m;area++)
            {
                int temp;
                scanf("%d",&temp);
                for(int i=0;i<temp;i++)
                {
                    scanf("%d",&town[i]);
                    region[town[i]].push_back(area);
                }
                for(int i=0;i<temp-1;i++)
                {
                    int tt;
                    if(town[i]<town[i+1])
                        tt=town[i]*1000+town[i+1];
                    else tt=town[i+1]*1000+town[i];
                    int t=exist[tt];
                    if(t)
                        dis[t][area]=dis[area][t]=1;
                    else exist[tt]=area;
                }
                int tt;
                if(town[0]<town[temp-1])
                    tt=town[0]*1000+town[temp-1];
                else tt=town[temp-1]*1000+town[0];
                int t=exist[tt];
                if(t)
                    dis[t][area]=dis[area][t]=1;
                else exist[tt]=area;
            }
            floyd();
            for(int i=1;i<=m;i++)
            {
                int tt=0;
                for(int j=0;j<num;j++)
                {
                    int temp=1000000000;
                    for(int k=0;k<region[club[j]].size();k++)
                    {
                        temp=min(temp,dis[region[club[j]][k]][i]);
                    }
                    tt+=temp;
                }
                ans=min(tt,ans);
            }
            printf("%d\n",ans);
        }
    }
    • 1

    信息

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