思路:
图论。
实现:
1 #include<bits/stdc++.h> 2 using namespace std; 3 int p[1005]; 4 void init(int n){ 5 for(int i=1;i<=n;i++){ 6 p[i]=i; 7 } 8 } 9 int find(int x){ 10 if(p[x]==x){ 11 return x; 12 } 13 return p[x]=find(p[x]); 14 } 15 void uni(int x,int y){ 16 x=find(x),y=find(y); 17 p[x]=y; 18 } 19 int main(){ 20 //freopen("in.txt","r",stdin); 21 int t;cin>>t; 22 while(t--){ 23 int n,s;cin>>n>>s; 24 vector<int>d(n+1,0); 25 init(n); 26 set<int>st; 27 int w=0; 28 for(int i=1;i<=n-1;i++){ 29 string t;cin>>t; 30 for(int j=0;j<i;j++){ 31 int to=j+1; 32 if(t[j]=='0'){ 33 d[i+1]++; 34 d[to]++; 35 uni(i+1,to); 36 st.insert(i+1); 37 st.insert(to); 38 w++; 39 } 40 } 41 } 42 int c=0; 43 for(int i=1;i<=n;i++){ 44 if(d[i]&1){ 45 c++; 46 } 47 } 48 if(c>2 or c==1){ 49 cout<<-1<<endl; 50 } 51 else if(c==2 and d[s]%2==0){ 52 cout<<-1<<endl; 53 } 54 else{ 55 set<int>tmp; 56 for(auto it:st){ 57 tmp.insert(p[it]); 58 } 59 int res=(tmp.size()-1)*2+w; 60 if(!st.count(s)){ 61 res+=2; 62 } 63 cout<<res<<endl; 64 } 65 } 66 return 0; 67 }