蒟蒻求教如何不T最后三个点
查看原帖
蒟蒻求教如何不T最后三个点
80026
walk_alone楼主2020/7/24 21:44

优化了五六次了,但是还是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;
}

在思路上是删边的想法,不知道怎么回事就特别慢。

2020/7/24 21:44
加载中...