L2-2 病毒溯源 (25 分)

输出路径

题目链接

记录每个点的前一个点
记录最长路径的最后一个点
便可以从后往前得到最长路径

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring> 
#include<queue>

using namespace std;
const int N=1e4+10; 
//int a[N],h[N],cnt[N];

int e[N],ne[N],idx,h[N],pre[N];
int n,end1;
int ans[N],b[N];
int dist[N];



void insert(int a,int b)
{
    pre[b]=a;
	e[idx]=b;
	ne[idx]=h[a];
	h[a]=idx++;
}

int bfs()
{
	int ans1=0;
	for(int j=0;j<n;j++)
	{
	    memset(dist,0,sizeof dist);
		queue<int> q;
		q.push(j);
		while(!q.empty())
		{
		    int hh=q.front();
		    q.pop();
			for(int i=h[hh];i!=-1;i=ne[i])
			{
				int p=e[i];
				q.push(p);
				dist[p]=dist[hh]+1;
				if(dist[p]>=ans1)
				{
				    end1=p;
				    ans1=dist[p];
				}
			}
		}
		
	}
	
	return ans1;
}

int main()
{
	//memset(ne,-1,sizeof ne);
	memset(h,-1,sizeof h);
	memset(pre,-1,sizeof pre);
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		int k;
		scanf("%d",&k);
		if(k==0) continue;
		else 
		{
			for(int j=1;j<=k;j++)	scanf("%d",&b[j]);
			sort(b+1,b+k+1);	
			for(int j=1;j<=k;j++) insert(i,b[j]);
			//for(int j=k;j>=1;j--) insert(i,b[j]);
		}
	}

	int res;
	res=bfs()+1;
	int k=res;
	
	//printf("endr=%d\n",endr);
	printf("%d\n",res);
	for(int i=end1;i!=-1;i=pre[i]) ans[k--]=i;
	
	for(int i=1;i<=res-1;i++) printf("%d ",ans[i]);
    printf("%d",ans[res]);
}

dfs

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring> 
#include<queue>

using namespace std;
const int N=1e4+10; 
//int a[N],h[N],cnt[N];

int e[N],ne[N],idx,h[N],pre[N];
int b[N];
bool st[N],st1[N];
int ans[N];
int res=0,end1,n;

void insert(int a,int b)
{
    pre[b]=a;
	e[idx]=b;
	ne[idx]=h[a];
	h[a]=idx++;
}

void dfs(int x,int sum)
{
    
    st1[x]=1;
    if(sum>res)
    {
        res=sum;
        end1=x;
    }
    //printf("h[x]=%d\n",h[x]);
	for(int i=h[x];i!=-1;i=ne[i])
	{
	    int j=e[i];
	    
	    if(!st1[j])
	    {
	        //printf("j=%d\n",j);
	        dfs(j,sum+1);
	    }
	}
}

int main()
{
	//memset(ne,-1,sizeof ne);
	memset(h,-1,sizeof h);
	memset(pre,-1,sizeof pre);
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		int k;
		scanf("%d",&k);
		if(k==0) continue;
		else 
		{
			for(int j=1;j<=k;j++)	scanf("%d",&b[j]),st[b[j]]=1;
			sort(b+1,b+k+1);	
			for(int j=k;j>=1;j--) insert(i,b[j]);
			//for(int j=k;j>=1;j--) insert(i,b[j]);
		}
	}
	
	for(int i=0;i<n;i++)
	{
	    if(st[i]==0) 
	    {
	        dfs(i,1);
	        break;
	    }
	}

	
	int k=res;
	
	printf("%d\n",res);
	for(int i=end1;i!=-1;i=pre[i]) ans[k--]=i;
	
	for(int i=1;i<=res-1;i++) printf("%d ",ans[i]);
    printf("%d",ans[res]);
}

#include<bits/stdc++.h>
using namespace std;
const int N = 10010;
vector<int>v[N];
int pre[N], h[N];
void bfs(int root, int& maxh, int& leaf) {
    queue<int>q;
    q.push(root);
    h[root] = 1;
    pre[root] = -1;
    while (!q.empty()) {
        root = q.front();
        for (int i = 0; i < v[root].size(); i++) {
            q.push(v[root][i]);
            pre[v[root][i]] = root;
            h[v[root][i]] = h[root] + 1;
            if (maxh < h[v[root][i]]) {
                maxh = h[v[root][i]];
                leaf = v[root][i];
            }
        }
        q.pop();
    }
}
void ouput(int x) {
    if (pre[x] == -1) cout << x;
    else {
        ouput(pre[x]);
        cout << " " << x;
    }
}
int main() {
    int n, root = 0, maxh = 1, leaf; cin >> n;
    for (int i = 0; i < n; i++) {
        int k; cin >> k;
        root += i;
        while (k--) {
            int x; cin >> x;
            v[i].push_back(x);
            root -= x;
        }
        stable_sort(v[i].begin(), v[i].end());
    }
    bfs(root, maxh, leaf);
    cout << maxh << endl;
    ouput(leaf);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值