传送门:https://vjudge.net/problem/ZOJ-1097
解题思路:
主要是找到每一节点的相邻节点,然后后面的用优先队列就行了。
#include <cstdio> #include <queue> #include <vector> #include <set> #include <iostream> using namespace std; void parse(vector<set<int> >&adj,unsigned int p=0){ unsigned int x; cin>>x; if(p){ adj[x].insert(p); adj[p].insert(x); } while(true){ char ch; cin>>ch; if(ch==')') break; parse(adj,x); } return ; } int main(){ char ch; while(cin>>ch){ vector<set<int> >adj(1020,set<int>()); parse(adj); priority_queue<int,vector<int>,greater<int> >leafs; int n=0; for(int i=0;i<adj.size();i++){ if(adj[i].size()!=0){ n++; if(adj[i].size()==1){ leafs.push(i); } } } for(int k=1;k<n;k++){ int x=leafs.top(); leafs.pop(); if(k>1) cout<<" "; int p=*(adj[x].begin()); cout<<p; adj[p].erase(x); if(adj[p].size()==1) leafs.push(p); } cout<<endl; } return 0; }