P2573 0分纠错xie歇歇蟹蟹
查看原帖
P2573 0分纠错xie歇歇蟹蟹
449587
LIUGUANG_noi楼主2021/12/6 21:43
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#define ll long long
using namespace std;
typedef pair<int,int> pii;
const int maxn=2000000+5,maxm=100000+5;
priority_queue<pii,vector<pii>,greater<pii> >pq;
struct Edge{
	ll u,v,nxt,w;
}edge[maxn],edge2[maxn];
ll ecount,ecount2,pcount;
ll head[maxm];
ll f[maxm],h[maxm];
queue<int> q;
bool vis[maxm];
int n,m;

inline ll read(){
	ll x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-')f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=x*10+c-'0';
		c=getchar();
	}
	return x*f;
} 
//ll find(int v){
//	if(f[v]==v)return v;
//	return f[v]=find(f[v]);
//}
inline void add(int u,int v,int w){
	ecount++;
	edge[ecount].v=v;
	edge[ecount].w=w;
	edge[ecount].nxt=head[u];
	head[u]=ecount;
}

void bfs(){
	memset(vis,0,sizeof vis);
	q.push(1);vis[1]=1;
	while(!q.empty()){
		int now=q.front();q.pop();
		for(int i=head[now];i;i=edge[i].nxt){
			ecount2++;
			edge2[ecount2].u=now;
			edge2[ecount2].v=edge[i].v;
			edge2[ecount2].w=edge[i].w;
			if(!vis[edge[i].v]){
				pcount++;
				q.push(edge[i].v);
				vis[edge[i].v]=1;
			}
		}
	}
}
ll sum;
void dijikstra(int s){
	memset(f,0x3f,sizeof(f));
	memset(vis,0,sizeof(vis));
	f[s]=0;
	pii r=make_pair(0,s);
	pq.push(r);
	while(!pq.empty()){
		r=pq.top();
		pq.pop();
		if(vis[r.second])continue;
		int u=r.second;
		int d=r.first;
		vis[u]=1;sum++;
		for(int i=head[u];i;i=edge[i].nxt){
			if(d+edge[i].w<f[edge[i].v]&&!vis[edge[i].v]){
				f[edge[i].v]=d+edge[i].w;
				
				pq.push(make_pair(f[edge[i].v],edge[i].v));
			}
		}
	}
}

int main(){
	n=read(),m=read();
	for(int i=1;i<=n;i++){
		h[i]=read();
		f[i]=i;
	}
	for(int i=1;i<=m;i++){
		int u=read(),v=read(),w=read();
		if(h[u]>h[v])add(u,v,w);
		if(h[u]<h[v])add(v,u,w);
	}
	dijikstra(1);
	bfs();
	printf("%lld %lld",pcount+1,f[n]);
	return 0; 
}
2021/12/6 21:43
加载中...