帝國交通 【暴力】
阿新 • • 發佈:2019-01-24
default cli scan 多少 att color size ons rom
輸入說明:第1行 m n ;第2行到第n+1行,每行兩個數字,描述有親戚關系的兩個王國編號。
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; }
帝國交通 【暴力】