欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Torn To Pieces-------------------------------思维(dfs+stringstream流)

程序员文章站 2022-06-08 17:57:57
...

Torn To Pieces-------------------------------思维(dfs+stringstream流)
Torn To Pieces-------------------------------思维(dfs+stringstream流)
Torn To Pieces-------------------------------思维(dfs+stringstream流)
Torn To Pieces-------------------------------思维(dfs+stringstream流)
题意:
给定n个站点连接的情况,最终询问能否从某个站点到达某个站点

解析:
用getline(cin,s) 把整个串读进来
然后用stringstream流 把字符串分解一下
然后把字符串数字化。
然后跑一遍dfs
如果能跑到终点我们直接输出路径。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10000;
int n;
vector<int> G[N],r;
int cnt;
string a,b,s;
map<string,int> v; 
map<int ,string > res;
int e;
int ans[N];
int dist[N], q[N];      // dist表示每个点到起点的距离, q 是队列  // 邻接表
bool st[N];     // 存储每个点是否在队列中
int pre[N];
void dfs(int u,int fa)
{
	st[u]=1;
	r.push_back(u);
	if(u==e)
	{
		for(auto j :r) cout<<res[j]<<" ";
		cout<<endl;
		exit(0); 
	}
	for(auto j: G[u])
	{
		if(!st[j]&&j!=fa)
		{
			dfs(j,u);
		}
	}
	r.pop_back();
}
int main()
{
	scanf("%d",&n);
	getchar();
	for(int i=1;i<=n;i++)
	{
		getline(cin,s);
		stringstream ss(s);
		ss>>a;
		if(!v[a])
		{
			v[a]=++cnt;
			res[cnt]=a;
		}
		
		while(ss>>b)
		{
			if(!v[b])
			{
				v[b]=++cnt;
				res[cnt]=b;
			}
			G[v[a]].push_back(v[b]);
			G[v[b]].push_back(v[a]);
		}
	
	}
	int t;
	cin>>a>>b;
	if(!v[a])
	{
		v[a]=++cnt;
		res[cnt]=a;
	 } 
	 if(!v[b])
	 {
	 	v[b]=++cnt;
	 	res[cnt]=b;
	 }
	int  s=v[a];e=v[b];
	dfs(s,s);
	cout<<"no route found"<<endl;
 }