首页 > 其他分享 >题解:UVA124 Following Orders

题解:UVA124 Following Orders

时间:2024-10-02 17:46:23浏览次数:4  
标签:map string inedge 题解 void graph Following input Orders

考虑深搜和拓扑排序。从入度为零的节点开始,逐步添加到当前的排列结果中,并在每一步递减相邻节点的入度。如果某个节点的入度变为零,就递归地将其添加到当前排列中。一旦达到排列的叶节点,就存储起来,并按字典顺序排序。

代码:

#include<bits/stdc++.h>
using namespace std;

void readVar(map<char,string>&graph,map<char,int>&inedge,string&input);
void mr(map<char,string>&graph,map<char,int>&inedge,string&input);
void alltopsort(map<char,string>&graph,map<char,int>&inedge);
void gettopsort(map<char,string>&graph,map<char,int>inedge,map<char,bool>visited,char start,set<string>&topos,string result);

int main(){
	string input;
	bool new_line=false;
	while(getline(std::cin,input)){
		if(new_line)cout<<endl;
		new_line=1;
		map<char,string>graph;
		map<char,int>inedge;
		readVar(graph,inedge,input);
		getline(std::cin,input);
		mr(graph,inedge,input);
		alltopsort(graph,inedge);
	}
	return 0;
}
void readVar(map<char,string>&graph,map<char,int>&inedge,string&input){
	stringstream ss(input);
	char tmp;
	string str;
	while(ss>>tmp){
		graph[tmp]=str;
		inedge[tmp]=0;
	}
	return;
}
void mr(map<char,string>&graph,map<char,int>&inedge,string&input){
	stringstream ss(input);
	char tmp1,tmp2;
	while(ss>>tmp1){
		ss>>tmp2;
		graph[tmp1].push_back(tmp2);
		++inedge[tmp2];
	}
	return;
}

void alltopsort(map<char,string>&graph,map<char,int>&inedge){
	set<string>topos;
	map<char,bool>visited;
	for(auto a:inedge)
		visited[a.first]=false;

	for(auto a:inedge)
		if(a.second==0)
			gettopsort(graph,inedge,visited,a.first,topos,"");
	for(auto a:topos)
		cout<<a<<endl;
	return;
}
void gettopsort(map<char,string>&graph,map<char,int>inedge,map<char,bool>visited,char start,set<string>&topos,string result){
	result=result+start;
	visited[start]=true;
	for(auto a:graph[start])
		inedge[a]--;
	bool leaf=true;
	for(auto a:inedge)
		if(!visited[a.first]&&a.second==0){
			leaf=false;
			gettopsort(graph,inedge,visited,a.first,topos,result);
		}
	if(leaf) topos.insert(result);
	return;
}

标签:map,string,inedge,题解,void,graph,Following,input,Orders
From: https://www.cnblogs.com/cly312/p/18444920

相关文章

  • 题解:UVA117 The Postal Worker Rings Once
    此题要求我们求欧拉回路的长度。使用Floyd算法计算图中任意两点之间的最短路径,对于度数为奇数的路口(最多有两个),找到它们之间的最短路径并将其加入总路径长度中。代码:#include<bits/stdc++.h>#defineINF1e8usingnamespacestd;intdegree[26];intpath[26][26];intal......
  • 题解:SP15553 STC00 - Hamsters
    首先,通过预处理计算每个名字的哈希值,然后利用哈希检查名字之间的最长公共前缀,从而确定从一个名字转移到另一个名字的最小代价。使用倍增动态规划计算转移的最小成本,\(f_{t,i,j}\)表示从名字\(i\)经过\(2^t\)步转移到名字\(j\)的最小代价,最后通过位运算处理\(M\)次转移的......
  • 题解:AT_abc373_d [ABC373D] Hidden Weights
    可以发现一个性质:对于图的每个连通分量,一旦在其中任何顶点上的值固定,则所有写入的值都是确定的。我们可以逐个DFS每个连通分量,按照题目的要求给每个点赋值,初始搜索的点值设成\(0\)即可。代码:#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;intn,m;......
  • 题解:SP19382 STK - Stock
    一道动态规划题。先分析状态。\(dp_{i\operatorname{and}1,k}\):表示在第\(i\)天最多进行\(k\)次交易的最大利润。\(s_{i\operatorname{and}1,k}\):表示在第\(i\)天之前的某天卖出之后,最多进行\(k-1\)次交易的最大利润减去当天的价格。接下来分析转移方程当\(i=0\)......
  • 题解:SP23875 DCEPC14A - Another Version of Inversion
    我们注意到这道题是二维的,所以要用到二维树状数组,不会的可以看一下这篇文章。这题的思路和P1908很像,按价值从大到小排序,排完序之后用树状数组维护,每次把这个数的位置加入到树状数组中,因为是排完序之后,所以之前加入的一定比后加入的大,然后在查询当前这个数前面位置的数(是前面位......
  • 题解:SP20038 SNGLOOP1 - Easiest Loop 1
    数学题。根据题目中给出的等式:\[(2n+3)(p-1)+\frac{4}{5}[(p\cdot{S}_{n})-{S}_{m}]=2(m-n)\]变形:\[(10n+15)(p-1)+4[(p\cdot{S}_{n})-{S}_{m}]=10m-10n\]\[(10m+15)p-10m-15+4{S}_{n}p-4{S}_{m}=10m-10n\]\[(10m+15+4{S}_{n})p=10m+15+4{S}_{m}\]\[p=\frac{10m+15+4{S}......
  • 题解:P1701 [USACO19OPEN] Cow Evolution B
    这题的关键就在于能否将问题转化成集合之间是否有交集。首先,考虑一个我们无法形成进化树的例子,例如这样:31fly1man2flyman如果我们想根据这个输入构建一棵树,我们需要在根上分割A或B,但剩下的两个子树都需要有一条边来添加另一个特征。显然输出为"No"。如果我们输入......
  • 题解:SP4555 ANARC08F - Einbahnstrasse
    一道多源最短路问题,肯定用Floyd,还有个问题就是怎么处理输入。使用sscanf(edge+2,"%d",&cost);从edge的第三个字符开始读取边权,然后处理左右两侧的箭头即可。#include<bits/stdc++.h>usingnamespacestd;map<string,int>cn;intct;intq[1028];intadd_city(constch......
  • 题解2:SP5449 ANARC09A - Seinfeld
    思路:考虑贪心。统计未配对的{:当遇到一个{时,增加未配对的{数量。当遇到一个}时,有两种情况:如果有多余的{,那么就用这个}与之前的{配对。如果没有多余的{,增加\(1\)次。遍历结束后:当我们遍历完字符串后,可能还会剩下一些未配对的{,需要通过将一部分{......
  • 题解:SP5449 ANARC09A - Seinfeld
    可以用动态规划解决。动态规划思想:设\(dp_{i,j}\)表示处理到字符串的第\(i\)个字符,并且未配对的{数量为\(j\)时,所需的最小操作次数。状态转移:初始化:\(dp_{0,0}=0\):表示空字符串且没有未配对的{,显然不需要任何操作。其他所有\(dp_{0,j}\)初始化为INF,表示不......