条件:首先给出n个顶点构成一个图,此图满足任何两个首都城市点之间不能通过边线连通。
第一行输入:n,m,k //n表示城市点的数量,m表示城市点之间的边数,k表示首都城市点的数量。
第二行输入k个首都诚实点的具体序号C1,C2,C3,..,Ck;
接下来m行是m条边的具体顶点。
求最多可以添加多少条边,并且保证图仍然能保持上述条件。
input
4 1 2 1 3 1 2
output
2
input
3 3 1 2 1 2 1 3 2 3
output
0
解题代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int b[1005][1005];
int a[1004];
bool dist[1004];
int dfs(int n)
{
int summ=0;
for(int i=0;i<=1000;i++)
{
if(b[n][i]==0)
{
if(dist[n]==true&&dist[i]==true)
continue;
dist[n]=true; dist[i]=true;
// printf("%d %d %d\n",n,i,b[6][7]);
int j=i;
b[n][i]=b[i][n]=2;
summ=summ+dfs(j)+1;
}
}
return summ;
}
int main()
{
int node[1004];
int n,m,k,ans=0,x,y,maxx=0,summ=0;
memset(a,-1,sizeof(a));
memset(b,-1,sizeof(b));
memset(node,-1,sizeof(node));
memset(dist,false,sizeof(dist));
scanf("%d%d%d",&n,&m,&k);
for(int i=0;i<k;i++)
{
scanf("%d",&x);
a[x]=0;
node[x]=0;
}
for(int i=0;i<m;i++)
{
scanf("%d%d",&x,&y);
b[x][y]=b[y][x]=0;
}
for(int i=0;i<=1000;i++)
if(a[i]==0)
{
a[i]=dfs(i);
}
for(int i=0;i<=1000;i++)
if(a[i]>a[maxx])
maxx=i;
for(int i=0;i<=1000;i++)
if(a[i]>0&&i!=maxx)
{
ans=ans+a[i]*(a[i]+1)/2;
summ=summ+a[i];
}
// printf("%d\n",a[2]);
ans=ans+(n-summ-k+1)*(n-summ-k)/2-m;
printf("%d\n",ans);
return 0;
}