标签:
2 3 1 1 2 3 2 1 2 2 3
2 1
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<iostream> using namespace std; int du[1000001]; int main() { int T; cin>>T; while(T--) { memset(du,0,sizeof(du)); int n,m; cin>>n>>m; for(int i=0;i<m;i++) { int x,y; cin>>x>>y; du[x]++; //每个节点的入度数先加1 du[y]++; } priority_queue<int ,vector<int>,greater<int> >x; //构造优先队列 //优先队列 int count=0; for(int i=1;i<=n;i++) { if(du[i]<2) //只要是入度数小于2的就压进队列中,因为如果要构成完美图 //,那么每个节点的入度数要大于等于2 { x.push(du[i]); } } while(x.size()>=2) { int t1=x.top(); //从队列中取出两个元素,因为一条边连接两个顶点 x.pop(); int t2=x.top(); x.pop(); t1++; t2++; count++; if(t1<2) //如果该节点的入度数还是小于2,继续压进队列 { x.push(t1); } if(t2<2) { x.push(t2); } } if(!x.empty())//如果队列中还剩余一个节点,那么条数也要加1 count++; cout<<count<<endl; } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/became_a_wolf/article/details/47164521