#include<bits/stdc++.h>
using namespace std;
#define SET(a) memset(a,-1,sizeof(a))
#define CLR(a) memset(a,0,sizeof(a))
#define PI acos(-1.0)
#define MOD 1000000007
#define MX 10010
struct Z{
int pv, nd;
bool operator < (const Z &p) const{
if(pv==p.pv) return nd<p.nd;
return pv>p.pv;
}
};
vector<int>adj[MX];
int t, dis[MX], low[MX], parent[MX], child[MX];
bool isArti[MX], vis[MX];
void findAP(int u, int root)
{
low[u] = dis[u] = ++t;
vis[u]=true;
int children=0;
for(int i=0;i<adj[u].size();i++)
{
int v=adj[u][i];
if(!vis[v])
{
children++;
parent[v]=u;
findAP(v, root);
low[u]=min(low[u], low[v]);
if(u==root && children>1) child[u]=max(child[u], children-1), isArti[u]=true;
else if(u!=root && low[v]>=dis[u]) child[u]++, isArti[u]=true;
}
else if(parent[u]!=v)
low[u]=min(low[u], dis[v]);
}
return;
}
vector<Z>v;
Z z;
int main()
{
ios_base::sync_with_stdio(0);cin.tie(0);
int n, m, x, y;
while(cin>>n>>m && n)
{
while(cin>>x>>y)
{
if(x==-1) break;
adj[x].push_back(y);
adj[y].push_back(x);
}
int add=0;
for(int i=0;i<n;i++)
if(!vis[i]) add++, findAP(i, i);
for(int i=0;i<n;i++)
{
z.nd=i;
z.pv=child[i]+add;
v.push_back(z);
}
sort(v.begin(), v.end());
for(int i=0;i<m;i++)
cout<<v[i].nd<<" "<<v[i].pv<<"\n";
cout<<"\n";
CLR(vis);
CLR(isArti);
CLR(child);
v.clear();
for(int i=0;i<n;i++) adj[i].clear();
}
return 0;
}
Wtranlamtippu1986 Miranda Gonzalez https://wakelet.com/wake/snoBSmXBVnZyNQqS9IRSR
ReplyDeletenanpijudu
Yatporstan_e Evelyn Gaddie Sketchup
ReplyDeleteAvid Pro Tools
Disk Drill
entaltobou