HDU 3849
http://acm.hdu.edu.cn/showproblem.php?pid=3849
const int Max_N = 100000 ;
struct Relation{
char s1[18] ;
char s2[18] ;
};
Relation relation[100008] ;
int N ,M ;
struct Edge{
int id ;
int v ;
Edge(){}
Edge(int _id , int _v):id(_id) , v(_v){}
};
vector<Edge> List[Max_N] ;
map <string , int> _hash ;
/*dfsn[u] , u的发现时间*/
/*low[u] , u及其后代能追溯到的最早(最早被发现)祖先v的dfsn[v]*/
int dfsn[Max_N] , low[Max_N] ;
int Time ;
void dfs(int u , int father){
dfsn[u] = low[u] = ++Time ;
for(int i = 0 ; i < List[u].size() ; i++){
int v = List[u][i].v ;
if(! dfsn[v]){
dfs(v , u) ;
low[u] = min(low[u] , low[v]) ;
}
else if(v != father)
low[u] = min(low[u] , dfsn[v]) ;
}
}
set<int> Gebian(){
Time = 0 ;
memset(dfsn , 0 , sizeof(dfsn)) ;
dfs(1 , -1) ;
set<int >ans ;
ans.clear() ;
for(int u = 1 ; u <= N ; u++){
if(dfsn[u] == 0)
return ans ;
}
for(int u = 1 ; u <= N ; u++){
for(int i = 0 ; i < List[u].size() ; i++){
int v = List[u][i].v ;
if(dfsn[u] < low[v]) //没有反向边,严格小于
ans.insert(List[u][i].id) ;
}
}
return ans ;
}
int main(){
int T , i , u , v , idx ;
set<int> ans ;
cin>>T ;
while(T--){
scanf("%d%d" ,&N ,&M) ;
for(i = 1 ; i <= N ; i++) List[i].clear() ;
_hash.clear() ;
idx = 1 ;
for(i = 1 ; i <= M ; i++){
scanf("%s%s" ,relation[i].s1 , relation[i].s2) ;
if(_hash.find(relation[i].s1) == _hash.end())
_hash[relation[i].s1] = u = idx++ ;
else
u = _hash[relation[i].s1] ;
if(_hash.find(relation[i].s2) == _hash.end())
_hash[relation[i].s2] = v = idx++ ;
else
v = _hash[relation[i].s2] ;
List[u].push_back(Edge(i , v)) ;
List[v].push_back(Edge(i , u)) ;
}
ans = Gebian() ;
printf("%d\n" , ans.size()) ;
for(set<int>::iterator it = ans.begin() ; it != ans.end() ; it++)
printf("%s %s\n" , relation[*it].s1 , relation[*it].s2) ;
}
return 0 ;
}