1. 程式人生 > >帝國交通 【暴力】

帝國交通 【暴力】

default cli scan 多少 att color size ons rom

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


思路:將環轉化成鏈
枚舉每一個點為斷點 將一個環切成一條鏈 斷點為初始點 前一個點為終點
斷點意味著連邊的時候不能跨過這個斷點 只能向“後”連
然後暴力連好邊之後每次計數連接邊數 取最小

#include <bits/stdc++.h>

using namespace std;
const int maxn = 10005;
const int maxm = 1005;
struct node{
    int u,v;  //u>v
}edge[maxn];
int point[maxm];

int main()
{
    int n,m;
    scanf("%d%d"
,&m,&n); for(int i=1;i<=n;i++) { int x,y; scanf("%d%d",&x,&y); int a = max(x,y),b= min(x,y); edge[i] = (node){a,b}; } int ans = m; for(int i=1;i<=m;i++) { memset(point,0,sizeof(point)); int now = 0;
int posv,posu; for(int j=1;j<=n;j++) { if(edge[j].v>=i) { posu = edge[j].u-i+1; posv = edge[j].v-i+1; point[posv]++; point[posu]--; } else if(edge[j].v<=i-1&&edge[j].u>=i) { posu = edge[j].u-i+1; posv = m-i+1+edge[j].v; point[posu]++; point[posv]--; } else { posv = m-i+1+edge[j].v; posu = m-i+1+edge[j].u; point[posv]++; point[posu]--; } } for(int j=1;j<m;j++) { point[j]+=point[j-1]; if(point[j]>0) now++; } ans = min(ans,now); } printf("%d",ans); return 0; }

 

帝國交通 【暴力】