明明我的代码过了7个点为什么才30啊QAQ
其实昨天写的已经快AC了。。只是那13种情况中有一种写错导致去了3个点,真是醉了。。
然而代码还是巨丑。。。
1 #include<bits/stdc++.h> 2 #define inc(i,l,r) for(i=l;i<=r;i++) 3 #define dec(i,l,r) for(i=l;i>=r;i--) 4 #define inf 1e9 5 #define mem(a) memset(a,0,sizeof(a)) 6 #define ll long long 7 #define succ(x) (1<<x) 8 #define NM 60000+5 9 #define nm 500000 10 using namespace std; 11 int read(){ 12 int x=0,f=1;char ch=getchar(); 13 while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();} 14 while(isdigit(ch))x=x*10+ch-'0',ch=getchar(); 15 return x*f; 16 } 17 struct edge{ 18 int t,v; 19 edge *next; 20 }e[nm],*h[NM],*_h[NM]; 21 int a[5],b[5],c[5],_x,_y,t,s,i,n,m,p,_n,f[NM]; 22 ll d[NM],d1[NM],d2[NM],_d1[NM],_d2[NM],ans[NM]; 23 bool v[NM]; 24 queue<int >q; 25 void add(int x,int y,int v){ 26 e[++s].t=y;e[s].v=v;e[s].next=h[x];h[x]=&e[s]; 27 } 28 void _add(int x,int y,int v){ 29 e[++s].t=y;e[s].v=v;e[s].next=_h[x];_h[x]=&e[s]; 30 } 31 int find(int x){ 32 return f[x]==x?x:f[x]=find(f[x]); 33 } 34 void lca(int x){ 35 f[x]=x; 36 for(edge *j=_h[x];j;j=j->next) 37 if(f[j->t]) 38 ans[j->v]=min(ans[j->v],d[j->t]+d[x]-2*d[find(j->t)]); 39 for(edge *j=h[x];j;j=j->next) 40 if(!f[j->t]){ 41 d[j->t]=d[x]+j->v; 42 lca(j->t); 43 f[j->t]=x; 44 } 45 } 46 void spfa(int x){ 47 mem(d);mem(v); 48 inc(i,1,n)d[i]=inf; 49 v[x]++;q.push(x);d[x]=0; 50 while(!q.empty()){ 51 int t=q.front();q.pop();v[t]=false; 52 for(edge *j=h[t];j;j=j->next) 53 if(d[j->t]>d[t]+j->v){ 54 d[j->t]=d[t]+j->v; 55 if(!v[j->t]){ 56 v[j->t]++;q.push(j->t); 57 } 58 } 59 } 60 } 61 int main(){ 62 n=read();m=read();p=read(); 63 inc(i,1,n)f[i]=i; 64 inc(i,1,m){ 65 _x=read();_y=read();t=read(); 66 if(find(_x)==find(_y)){ 67 a[++_n]=_x;b[_n]=_y;c[_n]=t; 68 continue; 69 } 70 f[find(_x)]=find(_y); 71 add(_x,_y,t);add(_y,_x,t); 72 } 73 if(a[1]){ 74 spfa(a[1]); 75 inc(i,1,n)d1[i]=d[i]; 76 spfa(b[1]); 77 inc(i,1,n)d2[i]=d[i]; 78 } 79 if(a[2]){ 80 spfa(a[2]); 81 inc(i,1,n)_d1[i]=d[i]; 82 spfa(b[2]); 83 inc(i,1,n)_d2[i]=d[i]; 84 } 85 inc(i,1,p){ 86 _x=read();_y=read();ans[i]=inf; 87 if(a[1]){ 88 ans[i]=d1[_x]+c[1]+d2[_y]; 89 ans[i]=min(ans[i],d2[_x]+c[1]+d1[_y]); 90 } 91 if(a[2]){ 92 ans[i]=min(ans[i],_d1[_x]+c[2]+_d2[_y]); 93 ans[i]=min(ans[i],_d2[_x]+c[2]+_d1[_y]); 94 ans[i]=min(ans[i],d1[_x]+c[1]+_d1[b[1]]+c[2]+_d2[_y]); 95 ans[i]=min(ans[i],d1[_x]+c[1]+_d2[b[1]]+c[2]+_d1[_y]); 96 ans[i]=min(ans[i],d2[_x]+c[1]+_d1[a[1]]+c[2]+_d2[_y]); 97 ans[i]=min(ans[i],d2[_x]+c[1]+_d2[a[1]]+c[2]+_d1[_y]); 98 ans[i]=min(ans[i],_d2[_x]+c[2]+d1[a[2]]+c[1]+d2[_y]); 99 ans[i]=min(ans[i],_d2[_x]+c[2]+d2[a[2]]+c[1]+d1[_y]); 100 ans[i]=min(ans[i],_d1[_x]+c[2]+d1[b[2]]+c[1]+d2[_y]); 101 ans[i]=min(ans[i],_d1[_x]+c[2]+d2[b[2]]+c[1]+d1[_y]); 102 } 103 _add(_x,_y,i);_add(_y,_x,i); 104 } 105 mem(d);mem(v);mem(f); 106 lca(1); 107 inc(i,1,p) 108 printf("%lld\n",ans[i]); 109 return 0; 110 }