leetcode685.冗余连接 II
一个一个试,深度优先算法判断是不是树,遍历个数判断图是否分裂。
这题不难。
class Solution { public: vector<int> a; #define siz 1001 int mapp[siz][siz]; int visited[siz]; bool ch; int inn[siz]; int outt[siz]; int ava[siz]; int pp=0; void dfs(int s){ int i; for(i=0;i<siz;i++){ if(ava[i]==1){ if(mapp[s][i]==1){ if(visited[i]==1){ ch=false; }else{ visited[i]=1; pp++; dfs(i); } } } } } vector<int> findRedundantDirectedConnection(vector<vector<int>>& edges) { int i,j; for(i=0;i<siz;i++){ inn[i]=0; outt[i]=0; ava[i]=0; for(j=0;j<siz;j++){ mapp[i][j]=0; } } for(i=0;i<edges.size();i++){ ava[edges[i][0]]=1; ava[edges[i][1]]=1; outt[edges[i][0]]++; inn[edges[i][1]]++; mapp[edges[i][0]][edges[i][1]]=1; } int pointnum=0; bool leg; int temp; for(i=0;i<siz;i++){ if(ava[i]==1){ pointnum++; } } int rec; for(i=edges.size()-1;i>=0;i--){ leg=true; temp=0; rec=-1; pp=0; outt[edges[i][0]]--; inn[edges[i][1]]--; mapp[edges[i][0]][edges[i][1]]=0; for(j=0;j<siz;j++){ if(ava[j]==1&&leg){ visited[j]=0; if(inn[j]==0){ temp++; rec=j; if(temp==2){ leg=false; } if(outt[j]==0){ leg=false; } } } } if(leg){ ch=true; dfs(rec); /*for(j=0;j<siz;j++){ if(ava[j]==1&&outt[j]+inn[j]==0){ ch=false; } }*/ if(ch&&pp+1==pointnum){ return edges[i]; }} outt[edges[i][0]]++; inn[edges[i][1]]++; mapp[edges[i][0]][edges[i][1]]=1; } return a; } };