码迷,mamicode.com
首页 > 其他好文 > 详细

NYOJ 20 吝啬的国度 【BFS+链式前向星建图,Vector建图】

时间:2016-08-24 17:33:07      阅读:219      评论:0      收藏:0      [点我收藏+]

标签:

吝啬的国度

时间限制:1000 ms  |  内存限制:65535 KB
难度:3
描述
在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来。现在,Tom在第S号城市,他有张该国地图,他想知道如果自己要去参观第T号城市,必须经过的前一个城市是几号城市(假设你不走重复的路)。
输入
第一行输入一个整数M表示测试数据共有M(1<=M<=5)组
每组测试数据的第一行输入一个正整数N(1<=N<=100000)和一个正整数S(1<=S<=100000),N表示城市的总个数,S表示参观者所在城市的编号
随后的N-1行,每行有两个正整数a,b(1<=a,b<=N),表示第a号城市和第b号城市之间有一条路连通。
输出
每组测试数据输N个正整数,其中,第i个数表示从S走到i号城市,必须要经过的上一个城市的编号。(其中i=S时,请输出-1)
样例输入
1
10 1
1 9
1 8
8 10
10 3
8 6
1 2
10 4
9 5
3 7
样例输出
-1 1 10 10 9 8 3 1 1 8
来源
经典题目
上传者
张云聪

原题链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=20


如果采用邻接矩阵建图,你懂的,进而想到链式前向星建图+BFS解决,当然用DFS也行。


AC代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int maxn=100000+5;
int n,s;
struct Edge
{
    int u,v,next;
} edge[maxn<<1];
int head[maxn];
int cnt;
bool vis[maxn];
int pre[maxn];
void Init()
{
    cnt=0;
    for(int i=1; i<=n; i++)
    {
        vis[i]=false;
        head[i]=-1;
        pre[i]=-1;
    }
}
void addEdge(int u,int v)
{
    edge[cnt].v=v;
    edge[cnt].next=head[u];
    head[u]=cnt++;
}
void BFS()
{
    vis[s]=true;
    pre[s]=-1;
    queue<int>q;
    q.push(s);
    while(!q.empty())
    {
        int p=q.front();
        q.pop();
        for(int i=head[p]; i!=-1; i=edge[i].next)
        {
            int v=edge[i].v;
            if(!vis[v])
            {
                vis[v]=true;
                pre[v]=p;
                q.push(v);
            }
        }
    }
}
int main()
{
    int T;
    //freopen("data/20.txt","r",stdin);
    cin>>T;
    while(T--)
    {
        cin>>n>>s;
        int x,y;
        Init();
        for(int i=1; i<n; i++)
        {
            scanf("%d%d",&x,&y);
            addEdge(x,y);
            addEdge(y,x);
        }
        /**
        for(int i=1; i<=n; i++)
        {
            cout<<i<<":";
            for(int j=head[i]; ~j; j=edge[j].next)
            {
                cout<<edge[j].v<<" ";
            }
            cout<<endl;
        }
        */
        BFS();
        for(int i=1; i<=n; i++)
        {

            if(i!=1)
                printf(" ");
            printf("%d",pre[i]);
        }
        cout<<endl;
    }
    return 0;
}

网上别人代码:Vector建图+BFS

讨论区92楼   xiangfeng林少

#include <iostream>
#include <stdio.h>
#include <vector>
using namespace std;
vector<int>a[100005];
int b[100005],n,s;
void dfs(int x,int y)
{
    for (int i = 0; i <a[x].size(); i++)
        if (a[x][i] != y)
            dfs(a[x][i],b[a[x][i]]=x);
    return;
}
int main()
{
    int M,x,y;
    scanf("%d",&M);
    while (M--)
    {
        scanf("%d%d",&n,&s);
        for (int i = 1; i <n; i++)
        {
            a[i].clear();
        }
        for (int i = 1; i <n; i++)
        {
            scanf("%d%d",&x,&y);
            a[x].push_back(y); //相当二维数组
            a[y].push_back(x);
        }
        b[s] = -1;//与S相等则为-1
        dfs(s,-1);
        for (int i = 1; i <= n; i++)
            printf("%d ",b[i]);
        printf("\n");
    }
    return 0;
}

OJ标程代码:

 

#include<iostream>
#include<vector>
#include<iterator>
using namespace std;
void MakeRoot(int search,int root,const vector<vector<int> >& g,vector<int> &result)
{
	for(vector<int>::const_iterator it=g[search].begin();it!=g[search].end();++it)
	{
		if(result[*it]==0)
		{
			result[*it]=search;
			MakeRoot(*it,root,g,result);
		}
	}
}
int main()
{
	int n;
	cin>>n;
	while(n--)
	{
		int m,a,b;
		cin>>m; int root;
		cin>>root; //m个点
		vector<vector<int> > g(m+1,vector<int>());
		for(int i=0;i!=m-1;i++)
		{
			cin>>a>>b;
			g[a].push_back(b);
			g[b].push_back(a);
		}
		vector<int> result(m+1);
		result[root]=-1;
		MakeRoot(root,root,g,result);
		copy(result.begin()+1,result.end(),ostream_iterator<int>(cout," "));
	}
}
        

本题目前排行第一代码

用户:李泉,运行号:1470045

 
#include <stdio.h>  
#include <memory.h>  
  
int map[100005];  
  
void Adjust(int currentCity)  
{  
    int priorCity = map[currentCity];  
    if (priorCity != 0)  
    {  
        Adjust(priorCity);  
        map[priorCity] = currentCity;  
    }  
}  
  
int main()  
{  
    int i, testNum, cityNum, startCity, cityA, cityB;  
    scanf("%d", &testNum);  
    while (testNum-- != 0)  
    {  
        scanf("%d%d", &cityNum, &startCity);  
        memset(map, 0, sizeof(int)*cityNum + 1);  
        for (i = 1; i < cityNum; i++)  
        {  
            scanf("%d%d", &cityA, &cityB);  
            if (map[cityB] == 0)  
            {  
                map[cityB] = cityA;  
            }  
            else  
            {  
                Adjust(cityA);  
                map[cityA] = cityB;  
            }  
        }  
        Adjust(startCity);  
        map[startCity] = - 1;  
        for (i = 1; i < cityNum; i++)  
        {  
            printf("%d ", map[i]);  
        }  
        printf("%d\n", map[i]);  
    }  
    return 0;  
}          

转载请注明出处:http://blog.csdn.net/hurmishine


NYOJ 20 吝啬的国度 【BFS+链式前向星建图,Vector建图】

标签:

原文地址:http://blog.csdn.net/hurmishine/article/details/52301291

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!