求助
查看原帖
求助
310439
星星与辰楼主2022/7/19 21:40
#include<bits/stdc++.h>
using namespace std;
typedef pair<long long,int> pii;
int head[100001],to[600001],nxt[600001],com[100001],cnt;
long long w[600001],dis[100001];
bool vis[500001];
inline void add(int x,int y,long long z){
	nxt[++cnt]=head[x];
	head[x]=cnt;
	to[cnt]=y;
	w[cnt]=z;
}
priority_queue<pii,vector<pii>,greater<pii> >q;
int main(){
	int n,m,k;
	scanf("%d%d%d",&n,&m,&k);
	int x,y;
	long long z;
	for(int i=1;i<=m;++i){
		scanf("%d%d%lld",&x,&y,&z);
		add(x,y,z);
		add(y,x,z);
	}
	for(int i=1;i<=k;++i){
		scanf("%d%lld",&x,&z);
		add(1,x,z);
	}
	memset(dis,-1,sizeof(dis));
	dis[1]=0;
	m<<=1;
	q.push(make_pair(0,1));
	while(!q.empty()){
		pii o=q.top();
		q.pop();
		int u=o.second;
		if(vis[u])continue;
		vis[u]=true;
		int i=head[u];
		while(i){
			if(dis[to[i]]>dis[u]+w[i]||dis[to[i]]==-1){
				dis[to[i]]=dis[u]+w[i];
				com[to[i]]=i;
				q.push(make_pair(dis[to[i]],to[i]));
			}else if(i<=m&&com[to[i]]>m&&dis[to[i]]==dis[u]+w[i])com[to[i]]=i;
			i=nxt[i];
		}
	}
	//1e5
	memset(vis,false,sizeof(vis));
	int ans=0;
	for(int i=1;i<=n;++i)
		if(com[i]>m){
			if(!vis[com[i]])++ans;
			vis[com[i]]=true;
		}
	printf("%d",k-ans);
	return 0;
}
2022/7/19 21:40
加载中...