题目链接
http://codeforces.com/problemset/problem/245/A
题意
构造一个含指定割点的连通图
思路
将v左边连一个,右边连n-2个,右边最大连边数为n+1+ (n-2)*(n-3)/2 ,然后n个点至少连n-1条边。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<string>
#include<queue>
#include<stack>
#include<set>
#include<map>
#define ll long long
using namespace std;
const int INF = ( 2e9 ) + 2;
const ll maxn = 1e5+100;
int vertex[maxn];
int cnt;
int main()
{
ll n,m,v;
scanf("%I64d%I64d%I64d",&n,&m,&v);
ll maxm = n-1 + (n-2)*(n-3)/2;
int minm = n-1;
cnt=0;
if(m>maxm||m<n-1)
printf("-1\n");
else
{
int u=1;
for(; u<=n&&u==v; u++);
printf("%d %d\n",u,v);
m--;
for(ll i=1; i<=n; i++)
if(i!=u&&i!=v)
vertex[cnt++]=i;
for(int i=0; i<cnt; i++)
{
printf("%I64d %d\n",v,vertex[i]);
m--;
}
for(int i=0; i<cnt; i++)
for(int j=i+1; j<cnt; j++)
{
if(m==0)return 0;
printf("%d %d\n",vertex[i],vertex[j]);
m--;
}
}
}