codevs round3 day1T2

明明我的代码过了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
",ans[i]);
109     return 0;
110 }
View Code
原文地址:https://www.cnblogs.com/onlyRP/p/4855647.html