cf D George and Interesting Graph

题意:给你一个有趣图的定义:在这个图中有一个根,根与每个点都有边和回边,除了根之外,其他的点的出度和入度都为2,然后给你一个图让你经过几步操作可以使此图变为有趣图,操作为:删边或者加边。

思路:枚举根,然后删除与根有关的边,重新建图,用二分图求最大匹配,可以用匈牙利算法,加的边数:满足题中有关根的加边数+(点数-匹配数),删掉的边数:边数-满足题中有关根的使用的边数-匹配时使用的边数。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <vector>
 4 #include <algorithm>
 5 using namespace std;
 6 const int inf=1<<29;
 7
 8 int g[600][600];
 9 int n,m;
10 bool chk[600];
11 int match[600];
12 vector<int>x[600];
13
14 int dfs(int p)
15 {
16     for(int i=0; i<(int)x[p].size(); i++)
17     {
18         int v=x[p][i];
19         if(!chk[v])
20         {
21            chk[v]=true;
22            int t=match[v];
23            match[v]=p;
24            if(t==-1||dfs(t))
25            {
26                return 1;
27            }
28            match[v]=t;
29         }
30     }
31     return 0;
32 }
33
34 int Pro(int c)
35 {
36      memset(match,-1,sizeof(match));
37      int res=0;
38      for(int i=1; i<=n; i++)
39      {
40          if(i==c) continue;
41          memset(chk,false,sizeof(chk));
42          res+=dfs(i);
43      }
44      return res;
45 }
46
47 int main()
48 {
49     while(scanf("%d%d",&n,&m)!=EOF)
50     {
51         vector<int>gg[600];
52         for(int i=1; i<=m; i++)
53         {
54             int u,v;
55             scanf("%d%d",&u,&v);
56             gg[u].push_back(v);
57             g[u][v]=1;
58         }
59         int ans=inf;
60         for(int i=1; i<=n; i++)
61         {
62             int t1=n-gg[i].size();
63             for(int j=1; j<=n; j++)
64             {
65                 if(!g[j][i]) t1++;
66             }
67             if(g[i][i]==0) t1--;
68             for(int j=1; j<=n; j++)
69             {
70                 x[j].clear();
71             }
72             int cnt=0;
73             for(int j=1; j<=n; j++)
74             {
75                 if(j==i) continue;
76                 for(int k=0; k<(int)gg[j].size(); k++)
77                 {
78                     int v=gg[j][k];
79                     if(v==i)continue;
80                     cnt++;
81                     x[j].push_back(v);
82                 }
83             }
84             ans=min(ans,t1+cnt+n-1-2*Pro(i));
85         }
86         printf("%d\n",ans);
87     }
88     return 0;
89 }

时间: 2024-10-06 18:27:33

cf D George and Interesting Graph的相关文章

Codeforces 916C - Jamie and Interesting Graph

916C - Jamie and Interesting Graph 思路:构造. 对于1到n最短路且素数,那么1到n之间连2 对于最小生成树,找一个稍微大点的素数(比1e5大)构造一个和为这个素数的最小生成树 剩下的边都连1e9 代码: #include<bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define mem(a,b) memset(a,b,sizeof(a)) /*c

cf B George and Round

题意:输入n,m,下一行为n个数a1<a2<a3......<an:然后再输入m个数b1<=b2<=b3<.....<=bm: 每个ai都必须在b中找到相等的数,找不到可以让比ai的大的数转化为ai,问最少需要添加几个数,使得ai在b都能找到相等的数. 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5

cf C. George and Number

http://codeforces.com/problemset/problem/387/C 题意:给你一个大数,让你求个集合,可以通过操作得到这个数,求集合中个数最大值,操作 :从集合中任意取两个数,大的数放在前面小的数放在后面组成一个数在重新放入集合中,经过重复的操作,集合中只剩一个数,这个数就是给你的数. 思路:要求个数最大,可以让这个大数的每一个数字为集合中的一个数,但是集合中不能有0,所以在连续的0前面要连着一个非零的数. 1 #include <cstdio> 2 #include

cf B George and Cards

题意:给你一个只有‘.’和'#'的n*n的格子,问所有的'#'是不是只属于一个十字叉,如果不是输出NO,否则输出YES. 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 6 int n; 7 char g[200][200]; 8 bool vis[200][200]; 9 10 int main() 11 { 12 scanf("

CF916C Jamie and Interesting Graph

思路:构造 实现: 1 #include <bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 int n, m; 6 cin >> n >> m; 7 cout << "100003 100003" << endl; 8 for (int i = 0; i < n - 2; i++) 9 { 10 cout << i + 1 << &

HDU 4365——Palindrome graph——————【规律+快速幂】

Palindrome graph Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 1727    Accepted Submission(s): 525 Problem Description In addition fond of programing, Jack also loves painting. He likes to dra

RRDtool深度理解

RRDtool深入学习 介绍 RRDtool:Round Robin Database Tool(轮询的数据库工具) 是一种存储数据的方式,使用固定大小的空间来存储数据,并有一个指针指向最新的数据的位置.我们可以把用于存储数据的数据库的空间看成一个圆,上面有很多刻度.这些刻度所在的位置就代表用于存储数据的地方.所谓指针,可以认为是从圆心指向这些刻度的一条直线.指针会随着数据的读写自动移动.要注意的是,这个圆没有起点和终点,所以指针可以一直移动,而不用担心到达终点后就无法前进的问题.在一段时间后,

A curated list of speech and natural language processing resources

A curated list of speech and natural language processing resources At Josh.ai, we’re often asked for developer resources relating to natural language processing, machine learning, and artificial intelligence. Paul Dixon, a researcher living in Kyoto

mxgraph进阶(三)Web绘图——mxGraph项目实战(精华篇)

Web绘图--mxGraph项目实战(精华篇) 声明     本文部分内容所属论文现已发表,请慎重对待. 需求 由于小论文实验需求,需要实现根据用户日志提取出行为序列,然后根据行为序列生成有向图的形式,并且连接相邻动作的弧上标有执行此次相邻动作的频次,每个动作另附有一个数据集,这样有向图加数据集就构成了用户交互图.为此,自己想到了mxGraph,遂决定学习之. 起步 此次项目实战是受阅读参考文献[1]启发,并在其图形布局实例基础上进行.其原始界面如图1所示,自己要实现的界面布局与之颇有几分神似.