codeforces C. System Administrator

大意是给定n,m,v,n个点,在这n个点之间连m条双向边,使得去掉点v之后该图不连通;

#

yy了一个能联通的最小值,树,如果m<n-1则无解;

then 最大值?

完全图,但是n-1个点的完全图,要抠出一个孤立的点只和v连接,确保v是割点

=(n-1)*(n-2)/2+1;

#

先判无解再输出方案

#include<bits/stdc++.h>
using namespace std;
int n,m,v,a,b;
int main()
{ 
    cin>>n>>m>>v;
    int minn=n-1;
    int maxn=(n-2)*(n-1)/2+1;
    //n=2,n=3?
    if(m<minn||m>maxn)
     {
        cout<<-1;return 0;    
     }
     
     m-=n-1;
     
     for(int i=1;i<=n;i++)
     {
         if(i==v) continue;
         cout<<v<<" "<<i<<endl;
     }
     
     if(m)
     {
         for(int i=2;i<n;i++)
          {
              if(i==v) continue;
              for(int j=1;j<i;j++)
               {
                   if(j==v) continue;
                   cout<<i<<" "<<j<<endl;
                   m--;
                   if(m==0) return 0;
               }
          }
     }
}

 

posted @ 2021-10-09 15:49  liyishui  阅读(39)  评论(0编辑  收藏  举报