60ptsWA
查看原帖
60ptsWA
524091
dami826楼主2024/7/23 11:16
#include<bits/stdc++.h>
#define bigg 2147483647
using namespace std;
int n,m,rnum,dis[3001],first[3001],save[3001],protect[3001][3001],pronum[3001];
bool vis[3001];
struct city{
	int num;
	bool operator <(const city x)const{
		return dis[num]>dis[x.num];
	}
};
priority_queue<city>heap;
struct road{
	int to,next,len;//to:终点 next:同出发点下另一条边 len:边权 
}r[70001]; 
void link(int from,int to,int len){
	r[++rnum]=(road){to,first[from],len};
	first[from]=rnum;
}
int main(){	
	scanf("%d %d",&n,&m);
	for(int i=1;i<=m;i++){
		int from,to,len;
		scanf("%d %d %d",&from,&to,&len);
		link(from,to,len);
	}
	for(int i=1;i<=n;i++){
		scanf("%d",&save[i]);
		dis[i]=(i==1?0:bigg);
		for(int j=1;j<=save[i];j++){
			int pro;
			scanf("%d",&pro);
			protect[pro][++pronum[pro]]=i;
		}
	}
	heap.push((city){1});
	while(!heap.empty()){
		city top=heap.top();
		heap.pop();
		if(vis[top.num]){
			continue;
		}
		vis[top.num]=true;
		for(int i=first[top.num];i!=0;i=r[i].next){
			if(dis[top.num]+r[i].len<dis[r[i].to]){
				dis[r[i].to]=dis[top.num]+r[i].len;
				if(save[r[i].to]==0){
					heap.push((city){r[i].to});
				}
			}
		}
		for(int i=0;i<=pronum[top.num];i++){
			save[protect[top.num][i]]--;
			dis[protect[top.num][i]]=max(dis[protect[top.num][i]],dis[top.num]);
			if(save[protect[top.num][i]]==0){
				heap.push((city){protect[top.num][i]});
			}
		}
	}
	printf("%d",dis[n]);
	return 0;
} 
2024/7/23 11:16
加载中...