最小树

#include<iostream>
#include<string>
using namespace std;
const int Max=20;
const int Mlen=9999;

struct zp{
int k;
int value;
};

struct ma{
    int h1;
    int h2;
    int v;
};

zp mar[Max][Max];
string*str;
int n,len;

void create(){
    for(int i=0;i<Max;i++)
        for(int j=0;j<Max;j++){
            mar[i][j].k=-1;
            mar[i][j].value=-1;
        }
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++){
            mar[i][j].k=0;
            mar[i][j].value=0;
        }
    str=new string[n];
    for(int i=0;i<n;i++){
        cin>>str[i];
    }
    cin>>len;
    for(int i=0;i<len;i++){
        string s1,s2;
        int num;
        cin>>s1>>s2>>num;
        int z1,z2;
        for(int i=0;i<n;i++){
            if(str[i]==s1)
                z1=i;
            if(str[i]==s2)
                z2=i;
        }
        mar[z1][z2].k=1;
        mar[z1][z2].value=num;
        mar[z2][z1].k=1;
        mar[z2][z1].value=num;
    }
     for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            cout<<mar[i][j].k;
            if(mar[i][j].k==1){
                cout<<"("<<mar[i][j].value<<")";
            }else{
            cout<<"   ";
            }
            //mar[i][j].value;
        }
        cout<<endl;
    }
}
void prim(){
    int ans=0;
    string u;
    cin>>u;
    cout<<"prim:"<<endl;
    int z;
    for(int i=0;i<n;i++){
        if(str[i]==u){
            z=i;
        }
    }
    ma*line=new ma[len];
    for(int i=0;i<len;i++){
        if(i!=z&&mar[z][i].k==1){
            line[i]={ z,i,mar[z][i].value};
        }else{
            line[i]={ -1,i,Mlen};
        }
    }
    line[z].v=0;
    ma key;
    int m=n-1;

    while(m--){
        int Min=Mlen;
        for(int i=0;i<len;i++){
            if(line[i].v!=0&&line[i].v<Min){
                key=line[i];
                Min=key.v;
            }
        }
        cout<<str[key.h1]<<" "<<str[key.h2]<<" "<<key.v<<endl;
        z=key.h2;
        line[z].v=0;
        for(int j=0;j<len;j++){
            if(mar[z][j].k==1&&line[j].v!=0){
                if(mar[z][j].value<line[j].v){
                    line[j].h1=z;
                    line[j].v=mar[z][j].value;
                }
            }
        }
/*
0   1(6)1(1)1(5)0   0
0   0   1(5)0   1(3)0
0   0   0   1(5)1(6)1(4)
0   0   0   0   0   1(2)
0   0   0   0   0   1(6)
0   0   0   0   0   0
*/
    }
}

void change(int visit[], int a, int b){//将两个顶点及与他们相通的顶点改成同样的值表示
                                              //他们相通
    for(int i= 0; i< n; i++)
      if(visit[i]== a)
        visit[i]= b;

}
void kruskal(){
    int*visit=new int[n];
    for(int i=0;i<n;i++){
        visit[i]=i;
    }
    cout<<"kruskal:"<<endl;
    int Min=Mlen;
    ma*line=new ma[n];
    for(int i=0;i<n;i++){
        line[i]={-1,-1,Mlen};
    }
    ma kk;
    for(int p=0;p<n;p++){

        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++){
                    if(visit[i]==1&&visist[j]==1)
                //判断该边是否可能成环
                int ww=0;
                for(int w=0;w<p;w++){
                    if(line[w].h1==i||line[w].h2==i)
                        ww++;
                    if(line[w].h1==j||line[w].h2==j)
                        ww++;
                }
                if(ww>=2)
                    continue;
                if(mar[i][j].value>0&&mar[i][j].value<Min)
                    Min=mar[i][j].value;
                    //cout<<Min<<" ";
                    kk.h1=i;
                    kk.h2=j;
                    kk.v=Min;
                    //kk={i,j,mar[i][j].value};
        }

        cout<<str[kk.h1]<<" "<<str[kk.h2]<<" "<<kk.v<<endl;
        visit[kk.h1]=1;
        visit[kk.h2]=1;
        mar[kk.h1][kk.h2].value=0;
        mar[kk.h2][kk.h1].value=0;
        line[p]=kk;
    }
}
int main(){
    cin>>n;
    create();
    prim();
    kruskal();
    return 0;
}
#include<iostream>
using namespace std;
const int Max=100;
const int Mlen=1000;
int n;
int q;

struct ma {
	int h1;
	int h2;
	int v;
};
int mar[Max][Max];
int*visit;

void create(){
    cin>>n;
    for(int i=0;i<Max;i++){
        for(int j=0;j<Max;j++){
            mar[i][j]=-1;
        }
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            cin>>mar[i][j];
        }
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            cout<<mar[i][j];
            cout<<"   ";
        }
        cout<<endl;
    }
    visit= new int[n];
	for (int i = 0; i<n; i++) {
		visit[i] = -1;
	}
    cin>>q;
    for(int i=0;i<q;i++){
        int m1,m2;
        cin>>m1>>m2;
        int t1=m1-1;
        int t2=m2-1;
        mar[t1][t2]=0;
        mar[t2][t1]=0;
        if (visit[t1] != -1 && visit[t2] == -1) {
			visit[t2] = visit[t1];
		}
		if (visit[t2] != -1 && visit[t1] == -1) {
			visit[t1] = visit[t2];
		}
		if (visit[t2] == -1 && visit[t1] == -1) {
			visit[t1] = t1;
			visit[t2] = t1;
		}
		if (visit[t1] != -1 && visit[t2] != -1) {
			int mm = visit[t2];
			for (int f = 0; f<n; f++) {
				if (visit[f] == mm) {
					visit[f] = visit[t1];
				}
			}
		}

    }
    for (int i = 0; i<n; i++) {
		cout<<visit[i]<<" ";
	}
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            cout<<mar[i][j];
            cout<<"   ";
        }
        cout<<endl;
    }
}


void kruskal() {
    int ans=0;

	int Min;
	ma kk;
	while(true) {//路径数目不一定等于点数减一
		Min = Mlen;
		for (int i = 0; i<n; i++) {
			for (int j = 0; j<n; j++) {
				if (visit[i] != -1 && visit[j] != -1) {
					if (visit[i] == visit[j]) {
						continue;
					}
				}
				if (mar[i][j]>0 && mar[i][j]<Min) {
					Min = mar[i][j];
					kk.h1 = i;
					kk.h2 = j;
					kk.v = Min;
				}
			}
		}
		int t1 = kk.h1;
		int t2 = kk.h2;
		ans+=kk.v;

		if (visit[t1] != -1 && visit[t2] == -1) {
			visit[t2] = visit[t1];
		}
		if (visit[t2] != -1 && visit[t1] == -1) {
			visit[t1] = visit[t2];
		}
		if (visit[t2] == -1 && visit[t1] == -1) {
			visit[t1] = t1;
			visit[t2] = t1;
		}
		if (visit[t1] != -1 && visit[t2] != -1) {
			int mm = visit[t2];
			for (int f = 0; f<n; f++) {
				if (visit[f] == mm) {
					visit[f] = visit[t1];
				}
			}
		}
		mar[kk.h1][kk.h2] = 0;
		mar[kk.h2][kk.h1] = 0;
		int zzz=0;
		for(int i=0;i<n;i++){
            if(visit[i]==-1){
                zzz=1;
            }
		}
		if(zzz==0){
            break;
		}


	}
	cout<<ans<<endl;

}
int main(){
    create();
    kruskal();
    return 0;
}
/*
4
0 990 1000 5
990 0 179 0
1000 179 0 26
5 0 26 0
2
1 2
4 3

4
0 990 692 5
990 0 5 0
692 5 0 26
5 0 26 0
2
1 2
4 3

4
0 990 692 5
990 0 179 0
692 179 0 26
5 0 26 0
3
1 2
2 3
1 4

3
0 990 692
990 0 179
692 179 0
2
1 2
1 3
*/

还剩一个问题:最小生成树的权值之和如何提前输出

#include<iostream>
#include<string>
using namespace std;
const int Max=20;
const int Mlen=9999;

struct zp{
int k;
int value;
};

struct ma{
    int h1;
    int h2;
    int v;
};

zp mar[Max][Max];
string*str;
int n,len;

void create(){
    for(int i=0;i<Max;i++)
        for(int j=0;j<Max;j++){
            mar[i][j].k=-1;
            mar[i][j].value=-1;
        }
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++){
            mar[i][j].k=0;
            mar[i][j].value=0;
        }
    str=new string[n];
    for(int i=0;i<n;i++){
        cin>>str[i];
    }
    cin>>len;
    for(int i=0;i<len;i++){
        string s1,s2;
        int num;
        cin>>s1>>s2>>num;
        int z1,z2;
        for(int i=0;i<n;i++){
            if(str[i]==s1)
                z1=i;
            if(str[i]==s2)
                z2=i;
        }
        mar[z1][z2].k=1;
        mar[z1][z2].value=num;
        mar[z2][z1].k=1;
        mar[z2][z1].value=num;
    }
     for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            cout<<mar[i][j].k;
            if(mar[i][j].k==1){
                cout<<"("<<mar[i][j].value<<")";
            }else{
            cout<<"   ";
            }
            //mar[i][j].value;
        }
        cout<<endl;
    }
}
void prim(){
    int ans=0;
    string u;
    cin>>u;
    cout<<"prim:"<<endl;
    int z;
    for(int i=0;i<n;i++){
        if(str[i]==u){
            z=i;
        }
    }
    ma*line=new ma[len];
    for(int i=0;i<len;i++){
        if(i!=z&&mar[z][i].k==1){
            line[i]={ z,i,mar[z][i].value};
        }else{
            line[i]={ -1,i,Mlen};
        }
    }
    line[z].v=0;
    ma key;
    int m=n-1;

    while(m--){
        int Min=Mlen;
        for(int i=0;i<len;i++){
            if(line[i].v!=0&&line[i].v<Min){
                key=line[i];
                Min=key.v;
            }
        }
        cout<<str[key.h1]<<" "<<str[key.h2]<<" "<<key.v<<endl;
        z=key.h2;
        line[z].v=0;
        for(int j=0;j<len;j++){
            if(mar[z][j].k==1&&line[j].v!=0){
                if(mar[z][j].value<line[j].v){
                    line[j].h1=z;
                    line[j].v=mar[z][j].value;
                }
            }
        }
    }
}

void kruskal(){
    int*visit=new int[n];
    for(int i=0;i<n;i++){
        visit[i]=-1;
    }
    cout<<"kruskal:"<<endl;
    int Min;
    ma*line=new ma[n];
    for(int i=0;i<n;i++){
        line[i]={-1,-1,Mlen};
    }
    ma kk;
    for(int p=0;p<n-1;p++){
        Min=Mlen;
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                if(visit[i]!=-1&&visit[j]!=-1){
                    if(visit[i]==visit[j]){
                        continue;
                    }
                }
                //判断该边是否可能成环
                if(mar[i][j].value>0&&mar[i][j].value<Min){
                    Min=mar[i][j].value;
                    //cout<<Min<<" ";
                    kk.h1=i;
                    kk.h2=j;
                    kk.v=Min;
                    //kk={i,j,mar[i][j].value};
                }
            }
        }
        int t1 =kk.h1;
        int t2 =kk.h2;
        cout<<str[t1]<<" "<<str[t2]<<" "<<kk.v<<endl;

        if(visit[t1]!=-1&&visit[t2]==-1){
            visit[t2]=visit[t1];
        }
        if(visit[t2]!=-1&&visit[t1]==-1){
            visit[t1]=visit[t2];
        }
        if(visit[t2]==-1&&visit[t1]==-1){
            visit[t1]=t1;
            visit[t2]=t1;
        }
        if(visit[t1]!=-1&&visit[t2]!=-1){
            int mm=visit[t2];
            for(int f=0;f<n;f++){
                if(visit[f]==mm){
                    visit[f]=visit[t1];
                }
            }
        }
        mar[kk.h1][kk.h2].value=0;
        mar[kk.h2][kk.h1].value=0;
        line[p]=kk;
    }
}
int main(){
    cin>>n;
    create();
    prim();
    kruskal();
    return 0;
}

搞定:

#include<iostream>
#include<string>
using namespace std;
const int Max=20;
const int Mlen=9999;

struct zp{
int k;
int value;
};

struct ma{
    int h1;
    int h2;
    int v;
};

zp mar[Max][Max];
string*str;
int n,len;
string u;

void create(){
    for(int i=0;i<Max;i++)
        for(int j=0;j<Max;j++){
            mar[i][j].k=-1;
            mar[i][j].value=-1;
        }
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++){
            mar[i][j].k=0;
            mar[i][j].value=0;
        }
    str=new string[n];
    for(int i=0;i<n;i++){
        cin>>str[i];
    }
    cin>>len;
    for(int i=0;i<len;i++){
        string s1,s2;
        int num;
        cin>>s1>>s2>>num;
        int z1,z2;
        for(int i=0;i<n;i++){
            if(str[i]==s1)
                z1=i;
            if(str[i]==s2)
                z2=i;
        }
        mar[z1][z2].k=1;
        mar[z1][z2].value=num;
        mar[z2][z1].k=1;
        mar[z2][z1].value=num;
    }
}
void ans(){
    int ans=0;
    cin>>u;
    int z;
    for(int i=0;i<n;i++){
        if(str[i]==u){
            z=i;
        }
    }
    ma*line=new ma[len];
    for(int i=0;i<len;i++){
        if(i!=z&&mar[z][i].k==1){
            line[i]={ z,i,mar[z][i].value};
        }else{
            line[i]={ -1,i,Mlen};
        }
    }
    line[z].v=0;
    ma key;
    int m=n-1;

    while(m--){
        int Min=Mlen;
        for(int i=0;i<len;i++){
            if(line[i].v!=0&&line[i].v<Min){
                key=line[i];
                Min=key.v;
            }
        }
        ans+=key.v;
        //cout<<str[key.h1]<<" "<<str[key.h2]<<" "<<key.v<<endl;
        z=key.h2;
        line[z].v=0;
        for(int j=0;j<len;j++){
            if(mar[z][j].k==1&&line[j].v!=0){
                if(mar[z][j].value<line[j].v){
                    line[j].h1=z;
                    line[j].v=mar[z][j].value;
                }
            }
        }
    }
    cout<<ans<<endl;
}

void prim(){
    int ans=0;
   // string u;
    //cin>>u;
    cout<<"prim:"<<endl;
    int z;
    for(int i=0;i<n;i++){
        if(str[i]==u){
            z=i;
        }
    }
    ma*line=new ma[len];
    for(int i=0;i<len;i++){
        if(i!=z&&mar[z][i].k==1){
            line[i]={ z,i,mar[z][i].value};
        }else{
            line[i]={ -1,i,Mlen};
        }
    }
    line[z].v=0;
    ma key;
    int m=n-1;

    while(m--){
        int Min=Mlen;
        for(int i=0;i<len;i++){
            if(line[i].v!=0&&line[i].v<Min){
                key=line[i];
                Min=key.v;
            }
        }
        cout<<str[key.h1]<<" "<<str[key.h2]<<" "<<key.v<<endl;
        z=key.h2;
        line[z].v=0;
        for(int j=0;j<len;j++){
            if(mar[z][j].k==1&&line[j].v!=0){
                if(mar[z][j].value<line[j].v){
                    line[j].h1=z;
                    line[j].v=mar[z][j].value;
                }
            }
        }
    }
}

void kruskal(){
    int*visit=new int[n];
    for(int i=0;i<n;i++){
        visit[i]=-1;
    }
    cout<<"kruskal:"<<endl;
    int Min;
    ma*line=new ma[n];
    for(int i=0;i<n;i++){
        line[i]={-1,-1,Mlen};
    }
    ma kk;
    for(int p=0;p<n-1;p++){
        Min=Mlen;
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                if(visit[i]!=-1&&visit[j]!=-1){
                    if(visit[i]==visit[j]){
                        continue;
                    }
                }
                //判断该边是否可能成环
                if(mar[i][j].value>0&&mar[i][j].value<Min){
                    Min=mar[i][j].value;
                    //cout<<Min<<" ";
                    kk.h1=i;
                    kk.h2=j;
                    kk.v=Min;
                    //kk={i,j,mar[i][j].value};
                }
            }
        }
        int t1 =kk.h1;
        int t2 =kk.h2;
        cout<<str[t1]<<" "<<str[t2]<<" "<<kk.v<<endl;

        if(visit[t1]!=-1&&visit[t2]==-1){
            visit[t2]=visit[t1];
        }
        if(visit[t2]!=-1&&visit[t1]==-1){
            visit[t1]=visit[t2];
        }
        if(visit[t2]==-1&&visit[t1]==-1){
            visit[t1]=t1;
            visit[t2]=t1;
        }
        if(visit[t1]!=-1&&visit[t2]!=-1){
            int mm=visit[t2];
            for(int f=0;f<n;f++){
                if(visit[f]==mm){
                    visit[f]=visit[t1];
                }
            }
        }
        mar[kk.h1][kk.h2].value=0;
        mar[kk.h2][kk.h1].value=0;
        line[p]=kk;
    }
}
int main(){
    cin>>n;
    create();
    ans();
    prim();
    kruskal();
    return 0;
}

正确,最终版:

#include<iostream>
#include<string>
using namespace std;
const int Max=20;
const int Mlen=9999;

struct zp{
int k;
int value;
};

struct ma{
    int h1;
    int h2;
    int v;
};

zp mar[Max][Max];
string*str;
int n,len;
string u;

void create(){
    for(int i=0;i<Max;i++)
        for(int j=0;j<Max;j++){
            mar[i][j].k=-1;
            mar[i][j].value=-1;
        }
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++){
            mar[i][j].k=0;
            mar[i][j].value=0;
        }
    str=new string[n];
    for(int i=0;i<n;i++){
        cin>>str[i];
    }
    cin>>len;
    for(int i=0;i<len;i++){
        string s1,s2;
        int num;
        cin>>s1>>s2>>num;
        int z1,z2;
        for(int i=0;i<n;i++){
            if(str[i]==s1)
                z1=i;
            if(str[i]==s2)
                z2=i;
        }
        mar[z1][z2].k=1;
        mar[z1][z2].value=num;
        mar[z2][z1].k=1;
        mar[z2][z1].value=num;
    }
}
void ans(){
    int ans=0;
    cin>>u;
    int z;
    for(int i=0;i<n;i++){
        if(str[i]==u){
            z=i;
        }
    }
    ma*line=new ma[len];
    for(int i=0;i<len;i++){
        if(i!=z&&mar[z][i].k==1){
            line[i]={ z,i,mar[z][i].value};
        }else{
            line[i]={ -1,i,Mlen};
        }
    }
    line[z].v=0;
    ma key;
    int m=n-1;

    while(m--){
        int Min=Mlen;
        for(int i=0;i<len;i++){
            if(line[i].v!=0&&line[i].v<Min){
                key=line[i];
                Min=key.v;
            }
        }
        ans+=key.v;
        z=key.h2;
        line[z].v=0;
        for(int j=0;j<len;j++){
            if(mar[z][j].k==1&&line[j].v!=0){
                if(mar[z][j].value<line[j].v){
                    line[j].h1=z;
                    line[j].v=mar[z][j].value;
                }
            }
        }
    }
    cout<<ans<<endl;
}

void prim(){
    int ans=0;
   // string u;
    //cin>>u;
    cout<<"prim:"<<endl;
    int z;
    for(int i=0;i<n;i++){
        if(str[i]==u){
            z=i;
        }
    }
    ma*line=new ma[len];
    for(int i=0;i<len;i++){
        if(i!=z&&mar[z][i].k==1){
            line[i]={ z,i,mar[z][i].value};
        }else{
            line[i]={ -1,i,Mlen};
        }
    }
    line[z].v=0;
    ma key;
    int m=n-1;

    while(m--){
        int Min=Mlen;
        for(int i=0;i<len;i++){
            if(line[i].v!=0&&line[i].v<Min){
                key=line[i];
                Min=key.v;
            }
        }
        cout<<str[key.h1]<<" "<<str[key.h2]<<" "<<key.v<<endl;
        z=key.h2;
        line[z].v=0;
        for(int j=0;j<len;j++){
            if(mar[z][j].k==1&&line[j].v!=0){
                if(mar[z][j].value<line[j].v){
                    line[j].h1=z;
                    line[j].v=mar[z][j].value;
                }
            }
        }
    }
}

void kruskal(){
    int*visit=new int[n];
    for(int i=0;i<n;i++){
        visit[i]=-1;
    }
    cout<<"kruskal:"<<endl;
    int Min;
    ma*line=new ma[n];
    for(int i=0;i<n;i++){
        line[i]={-1,-1,Mlen};
    }
    ma kk;
    for(int p=0;p<n-1;p++){
        Min=Mlen;
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                if(visit[i]!=-1&&visit[j]!=-1){
                    if(visit[i]==visit[j]){
                        continue;
                    }
                }
                if(mar[i][j].value>0&&mar[i][j].value<Min){
                    Min=mar[i][j].value;
                    kk.h1=i;
                    kk.h2=j;
                    kk.v=Min;
                }
            }
        }
        int t1 =kk.h1;
        int t2 =kk.h2;
        cout<<str[t1]<<" "<<str[t2]<<" "<<kk.v<<endl;

        if(visit[t1]!=-1&&visit[t2]==-1){
            visit[t2]=visit[t1];
        }
        if(visit[t2]!=-1&&visit[t1]==-1){
            visit[t1]=visit[t2];
        }
        if(visit[t2]==-1&&visit[t1]==-1){
            visit[t1]=t1;
            visit[t2]=t1;
        }
        if(visit[t1]!=-1&&visit[t2]!=-1){
            int mm=visit[t2];
            for(int f=0;f<n;f++){
                if(visit[f]==mm){
                    visit[f]=visit[t1];
                }
            }
        }
        mar[kk.h1][kk.h2].value=0;
        mar[kk.h2][kk.h1].value=0;
        line[p]=kk;
    }
}
int main(){
    cin>>n;
    create();
    ans();
    prim();
    kruskal();
    return 0;
}

第二题,还不错

#include<iostream>
#include<queue>
#include<cmath>
using namespace std;
const int Maxn=100;
int mar[Maxn][Maxn];



struct ma{
int k=0;//错误: ISO C ++禁止非const静态成员'k'的类内初始化
int x;
int y;
};

double ans(int x1,int y1,int x2,int y2){
    double b;
    b=sqrt(pow(x1-x2,2)+pow(y1-y2,2));
    return b;
}

void BFS(int m, int n, int Ma[Maxn][Maxn], bool*visit,int*findt) {
	queue<int>q;
	q.push(m);
	while (!q.empty()) {
		int v = q.front();
		if (visit[v] != true) {
			cout << v << " ";
			findt[v]=1;
			visit[v] = true;
		}
		q.pop();
		for (int i = 0; i < n; i++) {
			if (Ma[v][i] == 1 && visit[i] != true) {
				visit[i] = true;
				cout << i << " ";
				findt[i]=1;
				q.push(i);
			}
		}
	}
}

int main(){
    int n,d;
    cin>>n>>d;
    ma*st=new ma[n];
    for(int i=0;i<n;i++){
        cin>>st[i].x>>st[i].y;
    }
    char k;

    for(int i=0;i<Maxn;i++){
        for(int j=0;j<Maxn;j++){
            mar[i][j]=-1;
        }
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            mar[i][j]=0;
        }
    }

    while(cin>>k){
        if(k=='O'){
            int num;
            cin>>num;
            int z=num-1;
            st[z].k=1;
            for(int i=0;i<n;i++){
                if(i==z)
                    continue;
                if(st[i].k==1){
                    double an=ans(st[z].x,st[z].y,st[i].x,st[i].y);
                    if(an<=d){
                        mar[z][i]=1;
                        mar[i][z]=1;
                    }
                }
            }
        }
        if(k=='S'){
            int u1,u2;
            cin>>u1>>u2;
            int t1,t2;
            t1=u1-1;
            t2=u2-1;
            bool*visit = new bool[n];
            int*findt=new int[n];
            for (int i = 0; i < n; i++) {
                visit[i] = false;
                findt[i]=-0;
            }
            BFS(t1,n,mar,visit,findt);
            cout<<endl;
            if(findt[t2]==1){
                cout<<"SUCCESS"<<endl;
            }else{
            cout<<"FAIL"<<endl;
            }
        }
    }

    return 0;

}

这次没有问题了,非静态不要在结构体内初始化

#include<iostream>
#include<queue>
#include<cmath>
using namespace std;
const int Maxn=100;
int mar[Maxn][Maxn];


struct ma{
int k;
int x;
int y;
};

double ans(int x1,int y1,int x2,int y2){
    double b;
    b=sqrt(pow(x1-x2,2)+pow(y1-y2,2));
    return b;
}

void BFS(int m, int n, int Ma[Maxn][Maxn], bool*visit,int*findt) {
	queue<int>q;
	q.push(m);
	while (!q.empty()) {
		int v = q.front();
		if (visit[v] != true) {
			findt[v]=1;
			visit[v] = true;
		}
		q.pop();
		for (int i = 0; i < n; i++) {
			if (Ma[v][i] == 1 && visit[i] != true) {
				visit[i] = true;
				findt[i]=1;
				q.push(i);
			}
		}
	}
}

int main(){
    int n,d;
    cin>>n>>d;
    ma*st=new ma[n];
    for(int i=0;i<n;i++){
        st[i].k=0;
        cin>>st[i].x>>st[i].y;
    }
    char k;

    for(int i=0;i<Maxn;i++){
        for(int j=0;j<Maxn;j++){
            mar[i][j]=-1;
        }
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            mar[i][j]=0;
        }
    }

    while(cin>>k){
        if(k=='O'){
            int num;
            cin>>num;
            int z=num-1;
            st[z].k=1;
            for(int i=0;i<n;i++){
                if(i==z)
                    continue;
                if(st[i].k==1){
                    double an=ans(st[z].x,st[z].y,st[i].x,st[i].y);
                    if(an<=d){
                        mar[z][i]=1;
                        mar[i][z]=1;
                    }
                }
            }
        }
        if(k=='S'){
            int u1,u2;
            cin>>u1>>u2;
            int t1,t2;
            t1=u1-1;
            t2=u2-1;
            bool*visit = new bool[n];
            int*findt=new int[n];
            for (int i = 0; i < n; i++) {
                visit[i] = false;
                findt[i]=-0;
            }
            BFS(t1,n,mar,visit,findt);
            if(findt[t2]==1){
                cout<<"SUCCESS"<<endl;
            }else{
            cout<<"FAIL"<<endl;
            }
        }
    }

    return 0;

}

第三题感觉没什么问题,但就是过不了,错误50%

#include<iostream>
using namespace std;
const int Max=100;
const int Mlen=1000;
int n;
int q;

struct zp{
int k;
int value;
};
struct ma {
	int h1;
	int h2;
	int v;
};
zp mar[Max][Max];

void create(){
    cin>>n;
    for(int i=0;i<Max;i++){
        for(int j=0;j<Max;j++){
            mar[i][j].k=-1;
            mar[i][j].value=-1;
        }
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            cin>>mar[i][j].value;
            mar[i][j].k=0;
        }
    }

    cin>>q;
    for(int i=0;i<q;i++){
        int m1,m2;
        cin>>m1>>m2;
        int t1=m1-1;
        int t2=m2-1;
        mar[t1][t2].k=1;
        mar[t2][t1].k=1;
    }
}
void kruskal() {
    int ans=0;
	int*visit = new int[n];
	for (int i = 0; i<n; i++) {
		visit[i] = -1;
	}
	int Min;
	ma*line = new ma[n];
	for (int i = 0; i<n; i++) {
		line[i] = { -1,-1,Mlen };
	}
	ma kk;
	for (int p = 0; p<n -q- 1; p++) {
		Min = Mlen;
		for (int i = 0; i<n; i++) {
			for (int j = 0; j<n; j++) {
				if (visit[i] != -1 && visit[j] != -1) {
					if (visit[i] == visit[j]) {
						continue;
					}
				}
				if (mar[i][j].value>0 && mar[i][j].value<Min) {
					Min = mar[i][j].value;
					kk.h1 = i;
					kk.h2 = j;
					kk.v = Min;
				}
			}
		}
		int t1 = kk.h1;
		int t2 = kk.h2;
		ans+=kk.v;

		if (visit[t1] != -1 && visit[t2] == -1) {
			visit[t2] = visit[t1];
		}
		if (visit[t2] != -1 && visit[t1] == -1) {
			visit[t1] = visit[t2];
		}
		if (visit[t2] == -1 && visit[t1] == -1) {
			visit[t1] = t1;
			visit[t2] = t1;
		}
		if (visit[t1] != -1 && visit[t2] != -1) {
			int mm = visit[t2];
			for (int f = 0; f<n; f++) {
				if (visit[f] == mm) {
					visit[f] = visit[t1];
				}
			}
		}
		mar[kk.h1][kk.h2].value = 0;
		mar[kk.h2][kk.h1].value = 0;
		line[p] = kk;
	}
	cout<<ans<<endl;
}
int main(){
    create();
    kruskal();
    return 0;
}
/*
4
0 990 692 5
990 0 179 0
692 179 0 26
5 0 26 0
1
1 2

4
0 990 692 5
990 0 179 0
692 179 0 26
5 0 26 0
2
1 2
2 3

4
0 990 692 5
990 0 179 0
692 179 0 26
5 0 26 0
3
1 2
2 3
1 4
*/

0%

不知道哪里错了

#include<iostream>
using namespace std;
const int Max=100;
const int Mlen=1000;
int n;
int q;

struct ma {
	int h1;
	int h2;
	int v;
};
int mar[Max][Max];
int*visit;

void create(){
    cin>>n;
    for(int i=0;i<Max;i++){
        for(int j=0;j<Max;j++){
            mar[i][j]=-1;
        }
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            cin>>mar[i][j];
        }
    }
    visit= new int[n];
	for (int i = 0; i<n; i++) {
		visit[i] = -1;
	}
    cin>>q;
    for(int i=0;i<q;i++){
        int m1,m2;
        cin>>m1>>m2;
        int t1=m1-1;
        int t2=m2-1;
        mar[t1][t2]=0;
        mar[t2][t1]=0;
        if (visit[t1] != -1 && visit[t2] == -1) {
			visit[t2] = visit[t1];
		}
		if (visit[t2] != -1 && visit[t1] == -1) {
			visit[t1] = visit[t2];
		}
		if (visit[t2] == -1 && visit[t1] == -1) {
			visit[t1] = t1;
			visit[t2] = t1;
		}
		if (visit[t1] != -1 && visit[t2] != -1) {
			int mm = visit[t2];
			for (int f = 0; f<n; f++) {
				if (visit[f] == mm) {
					visit[f] = visit[t1];
				}
			}
		}
    }
}


void kruskal() {
    int ans=0;

	int Min;
	ma kk;
	for (int p = 0; p<n -q- 1; p++) {
		Min = Mlen;
		for (int i = 0; i<n; i++) {
			for (int j = 0; j<n; j++) {
				if (visit[i] != -1 && visit[j] != -1) {
					if (visit[i] == visit[j]) {
						continue;
					}
				}
				if (mar[i][j]>0 && mar[i][j]<Min) {
					Min = mar[i][j];
					kk.h1 = i;
					kk.h2 = j;
					kk.v = Min;
				}
			}
		}
		int t1 = kk.h1;
		int t2 = kk.h2;
		ans+=kk.v;

		if (visit[t1] != -1 && visit[t2] == -1) {
			visit[t2] = visit[t1];
		}
		if (visit[t2] != -1 && visit[t1] == -1) {
			visit[t1] = visit[t2];
		}
		if (visit[t2] == -1 && visit[t1] == -1) {
			visit[t1] = t1;
			visit[t2] = t1;
		}
		if (visit[t1] != -1 && visit[t2] != -1) {
			int mm = visit[t2];
			for (int f = 0; f<n; f++) {
				if (visit[f] == mm) {
					visit[f] = visit[t1];
				}
			}
		}
		mar[kk.h1][kk.h2] = 0;
		mar[kk.h2][kk.h1] = 0;
	}
	cout<<ans<<endl;
}
int main(){
    create();
    kruskal();
    return 0;
}
/*
4
0 990 1000 5
990 0 179 0
1000 179 0 26
5 0 26 0
2
1 2
4 3

4
0 990 692 5
990 0 5 0
692 5 0 26
5 0 26 0
2
1 2
4 3

4
0 990 692 5
990 0 179 0
692 179 0 26
5 0 26 0
3
1 2
2 3
1 4

3
0 990 692
990 0 179
692 179 0
2
1 2
1 3
*/

错误:Run-Time Check Failure #3 - The variable 'kk' is being used without being initialized.

#include<iostream>
using namespace std;
const int Max = 100;
const int Mlen = 1000;
int n;
int q;

struct ma {
	int h1;
	int h2;
	int v;
};
int mar[Max][Max];
int*visit;

void create() {
	cin >> n;
	for (int i = 0; i<Max; i++) {
		for (int j = 0; j<Max; j++) {
			mar[i][j] = -1;
		}
	}
	for (int i = 0; i<n; i++) {
		for (int j = 0; j<n; j++) {
			cin >> mar[i][j];
		}
	}
	visit = new int[n];
	for (int i = 0; i<n; i++) {
		visit[i] = -1;
	}
	cin >> q;
	for (int i = 0; i<q; i++) {
		int m1, m2;
		cin >> m1 >> m2;
		int t1 = m1 - 1;
		int t2 = m2 - 1;
		mar[t1][t2] = 0;
		mar[t2][t1] = 0;
		if (visit[t1] != -1 && visit[t2] == -1) {
			visit[t2] = visit[t1];
		}
		if (visit[t2] != -1 && visit[t1] == -1) {
			visit[t1] = visit[t2];
		}
		if (visit[t2] == -1 && visit[t1] == -1) {
			visit[t1] = t1;
			visit[t2] = t1;
		}
		if (visit[t1] != -1 && visit[t2] != -1) {
			int mm = visit[t2];
			for (int f = 0; f<n; f++) {
				if (visit[f] == mm) {
					visit[f] = visit[t1];
				}
			}
		}

	}
}


void kruskal() {
	int ans = 0;

	int Min;
	ma kk;
	int zz = 0;
	for (int i = 0; i<n; i++) {
		if (visit[i] == -1) {
			zz = 1;
		}
	}
	while (zz) {
		Min = Mlen;
		for (int i = 0; i<n; i++) {
			for (int j = 0; j<n; j++) {
				if (visit[i] != -1 && visit[j] != -1) {
					if (visit[i] == visit[j]) {
						continue;
					}
				}
				if (mar[i][j]>0 && mar[i][j]<Min) {
					Min = mar[i][j];
					kk.h1 = i;
					kk.h2 = j;
					kk.v = Min;
				}
			}
		}
		int t1 = kk.h1;
		int t2 = kk.h2;
		ans += kk.v;

		if (visit[t1] != -1 && visit[t2] == -1) {
			visit[t2] = visit[t1];
		}
		if (visit[t2] != -1 && visit[t1] == -1) {
			visit[t1] = visit[t2];
		}
		if (visit[t2] == -1 && visit[t1] == -1) {
			visit[t1] = t1;
			visit[t2] = t1;
		}
		if (visit[t1] != -1 && visit[t2] != -1) {
			int mm = visit[t2];
			for (int f = 0; f<n; f++) {
				if (visit[f] == mm) {
					visit[f] = visit[t1];
				}
			}
		}
		mar[kk.h1][kk.h2] = 0;
		mar[kk.h2][kk.h1] = 0;
		int zzz = 0;
		for (int i = 0; i<n; i++) {
			if (visit[i] == -1) {
				zzz = 1;
			}
		}
		if (zzz == 0) {
			break;
		}
	}
	cout << ans << endl;

}
int main() {
	create();
	kruskal();
	return 0;
}

还是不过???????什么问题啊怎么这么迷

猜你喜欢

转载自blog.csdn.net/Perce_Issac/article/details/84001904