#目前只写出了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;
}