输入一个无向图<V,E> V<=1e5, E<=3e5
现在另外给k条边(u=1,v=s[k],w=y[k])
问在不影响从结点1出发到所有结点的最短路的前提下,最多可以删除k条边的多少条
跑最短路的时候维护或者统计就好了
一开始用spfa.然后TLE 45...好久没写 Dij+堆优化 ...
p.s.优先队列默认大顶堆
Dij+堆优化 264ms
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 #include <cmath> 6 #include <queue> 7 #include <set> 8 #include <string> 9 using namespace std; 10 11 #define ll long long 12 #define maxn 100010 13 #define maxm 700010 14 15 int head[maxn]; 16 struct edge{ 17 int v,w,nxt; 18 }e[maxm]; 19 int E; 20 void init(){E=0;memset(head,-1,sizeof(head));} 21 void addedge(int u,int v,int w){ 22 e[E].v=v,e[E].w=w,e[E].nxt=head[u]; 23 head[u]=E++; 24 } 25 priority_queue<pair<ll,int> >que; 26 bool vis[maxn]; 27 //ll d[maxn]; 28 int main(){ 29 int n,m,k; 30 while(~scanf("%d%d%d",&n,&m,&k)){ 31 init(); 32 for(int i=0;i<m;++i){ 33 int u,v,w; 34 scanf("%d%d%d",&u,&v,&w); 35 addedge(u,v,w); 36 addedge(v,u,w); 37 } 38 que.push(make_pair(0ll,1)); 39 for(int i=0;i<k;++i){ 40 int s,y; 41 scanf("%d%d",&s,&y); 42 que.push(make_pair(0ll-y,-s)); 43 } 44 memset(vis,false,sizeof(vis)); 45 int ans=0; 46 while(!que.empty()){ 47 pair<ll,int> tmp = que.top();que.pop(); 48 ll dis = -tmp.first; 49 int u = tmp.second; 50 if(u<0){ 51 u=-u; 52 if(vis[u])++ans; 53 } 54 if(vis[u]) continue; 55 vis[u]=true; 56 //d[u] = dis; 57 for(int i=head[u];i!=-1;i=e[i].nxt) 58 if(vis[e[i].v]==false) 59 que.push(make_pair( -dis-e[i].w, e[i].v)); 60 } 61 printf("%d\n",ans); 62 } 63 return 0; 64 }