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;
}
};

浙公网安备 33010602011771号