NC236759. 中心图
描述
输入描述
第一行输入两个整数 ,分别表示原图的点数和边数。接下来行,每行输入两个整数 ,表示从 到 有一条有向边相连。保证输入不含重边。
输出描述
输出一行一个整数,表示让原图变为中心图需要的最小操作次数。
示例1
输入:
3 7 1 1 2 2 3 1 1 3 3 2 2 3 3 3
输出:
0
说明:
给出的图已经是一个中心图,中心点是3。示例2
输入:
3 1 2 2
输出:
6
示例3
输入:
3 6 1 1 2 2 3 1 3 2 2 3 3 3
输出:
1
C++(clang++ 11.0.1) 解法, 执行用时: 25ms, 内存消耗: 488K, 提交时间: 2023-05-02 23:09:49
#include<bits/stdc++.h> #define N 1005 using namespace std; vector<int> e[N]; int ins[N],out[N]; int c[N],vis[N],idx; int n,m,ans=1e9; bool dfs(int x){ for(auto y:e[x]){ if(vis[y]==idx) continue; vis[y]=idx; if(!c[y]||dfs(c[y])){ c[y]=x; return 1; } } return 0; } void work(int x){ memset(c,0,sizeof(c)); int sum=0; for(int i=1;i<=n;i++){ if(i==x) continue; vis[x]=1+idx++; sum+=dfs(i); } ans=min(ans,n*3+m-2-ins[x]*2-out[x]*2-sum*2); } int main(){ cin>>n>>m; int u,v; for(int i=1;i<=m;i++){ cin>>u>>v; e[u].push_back(v); ++ins[v],++out[u]; if(u==v) --ins[v]; } for(int i=1;i<=n;i++) work(i); cout<<ans<<endl; }