区块链 CCF 第四题-区块链

#目前只写出了80分的代码
主要的数据结构:

struct node{
	int id,t;
	friend bool operator < (node a1,node a2){
		return a1.t > a2.t;//重载<   t小的优先级高 
	}
};
struct node1{
	int id,t,block;
}; 
struct unit{
	int time;
	vector<int> que;
	friend bool operator <( unit a1,unit a2){
		return a1.time>a2.time;
	}
}; 
vector<int> que[maxn]; //用于输出每个主链的内容的临时变量 
vector<unit> que_orderBytime[maxn]; //记录不同时间的各个节点的主链内容 
vector<int> map_[maxn];//邻接表存图 

#具体过程见注释和代码

#include<bits/stdc++.h>
using namespace std;
const int maxn=500+10;
struct node{
	int id,t;
	friend bool operator < (node a1,node a2){
		return a1.t > a2.t;//重载<   t小的优先级高 
	}
};
struct node1{
	int id,t,block;
}; 
struct unit{
	int time;
	vector<int> que;
	friend bool operator <( unit a1,unit a2){
		return a1.time>a2.time;
	}
}; 
vector<int> que[maxn]; //用于输出每个主链的内容的临时变量 
vector<unit> que_orderBytime[maxn]; //记录不同时间的各个节点的主链内容 
vector<int> map_[maxn];//邻接表存图 
bool vis[maxn];
int n,m,t,k,tot=0; 
bool cmp(const  vector<int> &a1,const vector<int> &b1)  //引用传递 -- 不然会超时 
{
	if(a1.size()<b1.size()){
		return true;
	}
	else if( a1.size()==b1.size() ){
		if(a1[a1.size()-1] > b1[a1.size()-1] ) return true;
	}
	else return false;
} 
void update(int id,int t1)  //找到t1之前 最新的主链 
{					 
	for(vector<unit>::iterator it=que_orderBytime[id].begin();it!=que_orderBytime[id].end();it++)
	{
		if(it->time<= t1)//更新t1之前的   
		{
			if( cmp( que[id],it->que ) )
			{
				que[id]=it->que;//默认深拷贝 
			}				
		}
	} 
} 
void BFS(int id,int time)//采用BFS进行搜索 
{
		memset(vis,false,sizeof(vis));
		queue<node> q;
		q.push({id,time});
		vis[id]=true;
		while(!q.empty()){
			node v=q.front();
			q.pop();
			for(int i=0;i<map_[v.id].size();i++){
				int tmp=map_[v.id][i];
				if(vis[tmp]) continue;
				vis[tmp]=true;
				que_orderBytime[tmp].push_back({v.t+t,que[id]});  //添加(时间,主链)单元 
				q.push({tmp,v.t+t});
			}
		}
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		que[i].push_back(0);//默认一开始都有创始块0 
	}
	int u,v; 
	for(int i=0;i<m;i++){  //构图 
		cin>>u>>v;
		map_[u].push_back(v);
		map_[v].push_back(u);
	}
	scanf("%d%d",&t,&k);
	getchar();
	while(k--){
		//------------ 
		string line;
		getline(cin,line);
		stringstream ss(line);	
		int arr[6];
		int cur;
		int j=0;
		while(ss>>cur){
			arr[j]=cur;
			j++; 
		}
		//------------  输入处理 :主要用来区分是三个数 还是 两个数
		if(j==2){ //表示一行输入了两个数 
			
			update(arr[0],arr[1]); //先执行在当前时间之前进行的所有的加块更新-- 
			//输出当前的主链 
			printf("%d ",que[arr[0]].size());		   
			for(int i=0;i<que[arr[0]].size();i++){				
				printf("%d ",que[arr[0]][i]);
			} 
			printf("\n");
		} 
		else{					
			//进行更新
			update(arr[0],arr[1]);					
			//加块 
			que[arr[0]].push_back(arr[2]);        
			que_orderBytime[arr[0]].push_back({arr[1],que[arr[0]]});
			//采用BFS直接更新掉所有的临近点 
			BFS(arr[0],arr[1]); 	
		}
	}	 
	return 0;
} 
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值