社区讨论
求助 有可能是排序超时
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 条回复,欢迎继续交流。
正在加载回复...