10801: 帝国交通

题目描述

围绕新校的操场建有m(1到1000)个蚂蚁王国,根据相邻关系依次编号为1..m。其中有n(1到10000)对王国的国王之间有亲戚关系,有亲戚关系的王国需要有道路相通(可以以其它王国作为中转),任何一条道路只能建在相邻的两个王国之间,求出至少需要建多少条道路才能满足这n对王国的需求。
输入说明:第1行 m  n ;第2行到第n+1行,每行两个数字,描述有亲戚关系的两个王国编号。

 

输入

第1行 m  n ;第2行到第n+1行,每行两个数字,描述有亲戚关系的两个王国编号。

 

 

输出

1个数字,最少需要修建的道路数。

 

样例输入

复制样例数据

5 2
1 3
4 5

样例输出

3

 

来源/分类

2017济南发财兔 

#include<bits/stdc++.h>
#define N 10050
using namespace std;
 
pair<int,int> arr[N];
int id[N];
int m,n;
 
int cf[N];
 
int check()
{
    memset(cf,0,sizeof(cf));
    for(int i=0;i<n;i++)
    {
        int l=min(id[arr[i].first],id[arr[i].second]);
        int r=max(id[arr[i].first],id[arr[i].second]);
        cf[l]++;
        cf[r]--;
    }
 
    int ans=0;
    if(cf[0])ans=1;
 
    for(int i=1;i<m;i++)
    {
        cf[i]+=cf[i-1];
        if(cf[i])ans++;
    }
    return ans;
 
}
 
 
int main()
{
    int ans=m;
    scanf("%d %d",&m,&n);
    ans=m;
 
    for(int i=0;i<n;i++)scanf("%d %d",&arr[i].first,&arr[i].second),arr[i].first--,arr[i].second--;
 
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<m;j++)id[j]=(i+j)%m;
 
        ans=min(ans,check());
    }
    printf("%d\n",ans);
    return 0;
}










#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef pair<int,int> pa;
const ll mod=1e9+7;
#define lowbit(x)  x&(-x)
inline int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
    {
        x=x*10+ch-'0';
        ch=getchar();
    }
    return x*f;
}
struct node
{
    int u,v;
}edge[10050];
int n,m,cnt;
int ans;
int mmp[1050];
int main()
{
    scanf("%d %d",&m,&n);
    int x,y;
    for(int i=1;i<=n;i++)
    {
        scanf("%d %d",&x,&y);
//        edge[i].u=x;
//        edge[i].v=y;
        edge[i].u=max(x,y);
        edge[i].v=min(x,y);
    }
    ans=m;
    for(int i=1;i<=m;i++)
    {
        for(int j=1;j<=n;j++)
        {
//            if(edge[j].v>edge[j].u) swap(edge[j].v,edge[j].u);
            if(edge[j].v<=i-1&&edge[j].u>=i)
            {
                mmp[edge[j].u-i+1]+=1;
                mmp[m-i+1+edge[j].v]-=1;
            }
            else if(edge[j].v>=i)
            {
                mmp[edge[j].v-i+1]+=1;
                mmp[edge[j].u-i+1]-=1;
            }
            else
            {
                mmp[m-i+1+edge[j].v]+=1;
                mmp[m-i+1+edge[j].u]-=1;
            }
        }
        for(int j=1;j<m;j++)
        {
            mmp[j]+=mmp[j-1];
            if(mmp[j]>0)
            {
                cnt++;
            }
        }
        ans=min(ans,cnt);
        memset(mmp,0,sizeof(mmp));
        cnt=0;
    }
    printf("%d\n",ans);
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值