题目描述
围绕新校的操场建有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
来源/分类
#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;
}