社区讨论

求助 有可能是排序超时

P1111修复公路参与者 3已保存回复 13

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
13 条
当前快照
1 份
快照标识符
@mi4g6nuw
此快照首次捕获于
2025/11/18 18:45
4 个月前
此快照最后确认于
2025/11/18 18:51
4 个月前
查看原帖
CPP
#include<iostream>//不能冒泡排序t,x,y。 
using namespace std;
int n,m,x[100000],y[100000],t[100000];
int father[1000],sum[1000];//各个村庄的代表元;每个代表元分别有多少个下属 
void shell_sort(int size) 
{
    int i,j,k,temp,a1,a2;
    for(i=size/2;i>0;i/=2)
    {
        for(j=i;j<size;j++)
        {
            temp=t[j];
            a1=x[j];
            a2=y[j];
            for(k=j-i;k>=0&&temp<t[k];k-=i)
            {
                t[k+i]=t[k];
                x[k+i]=x[k];
                y[k+i]=y[k];
            }
            t[k+i]=temp;
            x[k+i]=a1;
            y[k+i]=a2;
        }
    }
}
void connect(int x,int y)
{
    int j1;
    if(sum[father[x-1]]>=sum[father[y-1]])
    {
        for(j1=0;j1<n;j1++)
        {
            if((father[j1]==father[y-1])&&(j1!=(y-1))) 
            {
                father[j1]=father[x-1];
                sum[father[x-1]]++;
            }
        }
        sum[father[y-1]]=0;
        father[y-1]=father[x-1];
        sum[father[x-1]]++;
        //cout<<"此次为:"<<sum[father[x-1]]<<endl;
        if(sum[father[x-1]]==n) 
        {
            n=-1;
        }
        return;
    }
    else 
    {
        for(j1=0;j1<n;j1++)
        {
            if((father[j1]==father[x-1])&&(j1!=(x-1))) 
            {
                father[j1]=father[y-1];
                sum[father[y-1]]++;
            }
        }
        sum[father[x-1]]=0;
        father[x-1]=father[y-1];
        sum[father[y-1]]++;
        //cout<<"此次为:"<<sum[father[y-1]]<<endl;
        if(sum[father[y-1]]==n) 
        {
            n=-1;
        }
        return;
    }
}
int main()
{
    int i1,i2,i3;
    cin>>n>>m;
    for(i1=0;;i1++)
    {
        if(i1<n)
        {
            father[i1]=i1;
            sum[i1]=1;
            //cout<<"sum"<<i1<<"="<<sum[i1]<<endl;
            //cout<<"father"<<i1<<"="<<father[i1]<<endl;
        }
        //t[i1]=100000;
        if(i1<m) cin>>x[i1]>>y[i1]>>t[i1];
        if(i1>=n&&i1>=m) break;
    }
    //for(i1=0;i1<m;i1++)
    //{
        //for(i2=i1+1;i2<m;i2++)
        //{
            //if(t[i1]>t[i2])
            //{
                //i3=t[i1];
                //t[i1]=t[i2];
                //t[i2]=i3;
                //i3=x[i1];
                //x[i1]=x[i2];
                //x[i2]=i3;
                //i3=y[i1];
                //y[i1]=y[i2];
                //y[i2]=i3;
            //}
        //}
    //}
    shell_sort(m);
    for(i1=0;i1<m;i1++)
    {
        //cout<<x[i1]<<" "<<y[i1]<<" "<<t[i1]<<endl;
        if(father[x[i1]-1]==father[y[i1]-1]) 
        {
            //cout<<"NO!"<<endl;
            continue;    
        }
        //cout<<"YES!"<<endl;
        connect(x[i1],y[i1]);
        if(n==-1) 
        {
            cout<<t[i1];
            return 0;
        }
    }
    cout<<-1;
} 
//下面是问题。
//如果用sort快排,那如何让x,y随着t的换位而换位?

回复

13 条回复,欢迎继续交流。

正在加载回复...