优化了五六次了,但是还是T了最后三个,算了一下复杂度应该也就n²左右,但是不知道怎么就是特别慢,5000的数据大概得8s。
#include <cstdio>
#include <queue>
#include <algorithm>
using namespace std;
bool book[5005];
struct line
{
int from;
int to;
int flag;
int next;
};
struct line que[10001];
int travel[5005],cnt,headers[5005],n,step,ans[5005],used[5005],f[5005],depth[5005];
void add(int from,int to)
{
cnt++;
que[cnt].from=from;
que[cnt].to=to;
que[cnt].next=headers[from];
headers[from]=cnt;
}
bool cmp(int a[],int b[])
{
int i=1;
while(a[i]==b[i])
i++;
return a[i]<b[i];
}
void dfstree(int u,int father)
{
if(book[u])
return;
book[u]=1;
step++;
ans[step]=u;
priority_queue<int,vector<int>,greater<int> >q;
for(int i=headers[u];i;i=que[i].next)
if(que[i].to!=father && !que[i].flag)
q.push(que[i].to);
while(!q.empty())
{
dfstree(q.top(),u);
q.pop();
}
return;
}
int main()
{
int m,a,b;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
travel[i]=n;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
add(a,b);
add(b,a);
}
if(m==n-1)
{
dfstree(1,1);
for(int i=1;i<=n;i++)
travel[i]=ans[i];
}
else
for(int i=1;i<cnt;i+=2)
{
que[i].flag=que[i+1].flag=1;
step=0;
for(int k=1;k<=n;k++)
book[k]=0;
dfstree(1,1);
que[i].flag=que[i+1].flag=0;
if(step<n)
continue;
else
if(cmp(ans,travel))
for(int i=1;i<=n;i++)
travel[i]=ans[i];
}
for(int i=1;i<=n;i++)
printf("%d ",travel[i]);
return 0;
}
在思路上是删边的想法,不知道怎么回事就特别慢。