Jzzhu and Cities CodeForces - 449B(dijkstra+记录路径)
跑最短路记录路径,最后每个点最电路的路径里有多少铁路,这些铁路是不能删掉的,没有出现过的就可以删掉。
跑最短路的时候注意在长度相同时要优先用公路来更新。
#include<bits/stdc++.h> using namespace std; #define int long long #define ll long long #define inf 0x3f3f3f3f #define mem(a,b) memset(a,b,sizeof(a)) const int maxn=3e5+10; int n,m,k,t; int ans; struct edge{ int u,v,w,next,ok; }e[maxn*4]; int g[maxn*4],d[maxn],path[maxn]; int vis[maxn*4]; int tot=0; void add(int u,int v,int w,int ok) { e[++tot]=(edge){u,v,w,g[u],ok}; g[u]=tot; } struct node{ int pos,w; bool operator < (const node cmp) const{ return w>cmp.w; } }; void dj(int u) { priority_queue<node>q; q.push((node){u,0}); for(int i=1;i<=n;i++) d[i]=1e18; d[u]=0; path[u]=-1; while(!q.empty()) { u=q.top().pos; q.pop(); if(vis[u]) continue; vis[u]=1; for(int i=g[u];i;i=e[i].next) { int v=e[i].v,w=e[i].w,ok=e[i].ok; if((d[v]>=d[u]+w&&!ok)||(d[v]>d[u]+w&&ok)) { d[v]=d[u]+w; path[v]=i; q.push((node){v,d[v]}); } } } } void dfs(int v) { int i=path[v]; if(i==-1||i==0) return ; if((e[i].ok==1)&&(vis[i]==0)) { ans--; } vis[i]=1; int u=e[i].u; if(u==1||vis[i]) return ; dfs(u); } #undef int int main() { #define int long long cin>>n>>m>>k; ans=k; for(int i=1;i<=m;i++) { int u,v,w; cin>>u>>v>>w; add(u,v,w,0); add(v,u,w,0); } for(int i=1;i<=k;i++) { int v,w; cin>>v>>w; add(1,v,w,1); } dj(1); mem(vis,0); for(int i=2;i<=n;i++) { dfs(i); } cout<<ans<<"\n"; return 0; }