1 条题解

  • 0
    @ 2023-4-7 11:07:45

    a, b作为边权,很容易想到图论算法。 上代码:

    方法1:

    #include<bits/stdc++.h>
    using namespace std; //Dijkstra O(n^2)
    
    int main(){
    	int a[3][3]={{2147483640,2147483640,2147483640},{2147483640,2147483640,2147483640},{2147483640,2147483640,2147483640}};
    	scanf("%d %d",&a[0][1],&a[1][2]);
    	for(int i=1;i<=2;i++){
    		for(int j=i;j<=2;j++)
    			if(a[0][i]+a[i][j]<a[0][j]&&a[i][j]<1000000001&&a[0][i]<1000000001)
    				a[0][j]=a[0][i]+a[i][j];
    	}
    	printf("%d\n",a[0][2]);
    	return 0;
    }
    

    方法2:

    #include<bits/stdc++.h>
    using namespace std;//Kruskal O(n^2)
    
    struct Node{
    	int x1,x2,s;
    }data[10];
    int ans=0,dad[5],tot=2;
    bool cmp(Node a,Node b){
    	return a.s>b.s;
    }
    int father(int a){
    	while(dad[a]!=a)a=dad[a];
    	return a;
    }
    int main() {
    	scanf("%d %d",&data[1].s,&data[2].s);
    	data[1].x1=1;data[1].x2=2;
    	data[2].x1=2;data[2].x2=3;
    	sort(data+1,data+tot+1,cmp);
    	for(int i=1;i<=tot+1;i++)dad[i]=i;
    	for(int i=1;i<=tot;i++){
    		if(father(data[i].x1)!=father(data[i].x2)){
    			dad[data[i].x1]=data[i].x2;
    			ans+=data[i].s;
    		}
    	}
    	printf("%d\n",ans);
    	return 0;
    }
    

    方法3:

    #include<bits/stdc++.h>
    using namespace std;//Floyd O(n^3)
    
    int main() {
    	int n=3,a[3][3]={{2147483640,2147483640,2147483640},{2147483640,2147483640,2147483640},{2147483640,2147483640,2147483640}};
    	scanf("%d %d",&a[1][2],&a[2][3]);
    	a[2][1]=a[1][2];
    	a[3][2]=a[2][3];
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=n;j++){
    			for(int k=1;k<=n;k++){
    				if(a[j][k]<=1e9&&a[i][k]<=1e9&&i!=j&&k!=j&&i!=k){
    					if(a[i][j]>a[i][k]+a[j][k])a[i][j]=a[i][k]+a[j][k];
    				}
    			}
    		}
    	}
    	printf("%d\n",a[1][3]);
    	return 0;
    }
    

    大功告成。

    • 1

    信息

    ID
    6642
    时间
    1000ms
    内存
    128MiB
    难度
    1
    标签
    (无)
    递交数
    4
    已通过
    3
    上传者