链接:Gym - 101630C,动动手指打开你的codeforce.com就可,反正也没人看(->_->)
题意:留下2n条边,使所有点都相互联通
思路:建正边和反边,均和你随机选择的一个点在两张图中和任一点联通即可,两遍dfs,这个正反边在kuangbin最短路专题中有。
然后因为链式前向星的存图方式正好可以标记边,直接标记即可。

哦对忘了说了,t组数据要清空,要清空!!!
然后就是最爱的代码环节

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+9;
int ver[maxn],Next[maxn],head[maxn];
int tot;int n,m;
struct node
{
    int l,r;
}edge[maxn];
void add(int x,int y)
{
    ver[++tot]=y;
    Next[tot]=head[x];
    head[x]=tot;
}
int ver1[maxn],Next1[maxn],head1[maxn];
int tot1;
void add1(int x,int y)
{
    ver1[++tot1]=y;
    Next1[tot1]=head1[x];
    head1[x]=tot1;
}
bool book[maxn];///标记边
int vis[maxn],vis1[maxn];
void dfs(int x)
{
    vis[x]=1;
    for(int i=head[x];i;i=Next[i])
    {
        int y=ver[i];
        if(vis[y])continue;
        book[i]=1;
        dfs(y);
    }
}
void dfs1(int x)
{
    vis1[x]=1;
// cout<<"dfs="<<x<<endl;
    for(int i=head1[x];i;i=Next1[i])
    {
        int y=ver1[i];
        if(vis1[y])continue;
        book[i]=1;
        dfs1(y);
    }
}

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        memset(head,0,sizeof head);
        memset(head1,0,sizeof head1);
        memset(book,0,sizeof book);
        memset(vis,0,sizeof vis);
        memset(vis1,0,sizeof vis1);
        tot=0,tot1=0;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++)
        {
            int u,v;
            scanf("%d%d",&u,&v);
            add(u,v);
            add1(v,u);
            edge[i].l=u;
            edge[i].r=v;
// cout<<i<<" "<<tot<<" "<<tot1<<endl;
        }
        dfs(1);
        dfs1(1);
        int num=m-2*n;
        for(int i=1;i<=m;i++)
        {
// cout<<"i=="<<book[i]<<endl;
            if(!book[i])
            {
                printf("%d %d\n",edge[i].l,edge[i].r);
                num--;
            }
            if(num==0)break;
        }
// cout<<endl;
// for(int i=1;i<=n;i++)
// cout<<vis[i]<<" "<<vis1[i]<<endl;
    }


}