bzoj 2330 糖果
恶心死我了,调试了3个小时,居然是图连错了,一直在搞第5个点的TLE,原因大概是跑最长路的时候建了st点,然后那个点貌似是个大环,然后就无限第跑个不停......一晚上啊!!! 不过差分约束还是比较好理解的,把不等关系变成三角不等式的形式,可以跑最长路也可以跑最短路,只不过连边不太一样罢了,跑之前自己想好就行了。 不想在说什么了,恶心!
View Code
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #define maxn 2200000 7 #define inf 0x3f3f3f3f 8 using namespace std; 9 10 struct et 11 { 12 int s,t,next; 13 long long val; 14 }e[maxn]; 15 int q[maxn*5],c[maxn],fir[maxn]; 16 bool inque[maxn]; 17 long long d[maxn]; 18 int n,m,tot,st; 19 20 bool spfa() 21 { 22 //for (int i=1;i<=n;i++) d[i]=-inf,c[i]=0,inque[i]=0; 23 //q[1]=st; inque[st]=1; d[st]=0; 24 for (int i=1;i<=n;i++) q[i]=i,d[i]=1,inque[i]=1,c[i]=1; 25 int head=0,tail=n; 26 while (head!=tail) 27 { 28 head=(head+1)%(n+1); 29 int now=q[head]; 30 for (int j=fir[now];j;j=e[j].next) 31 { 32 int k=e[j].t; 33 if (d[now]+e[j].val>d[k]) 34 { 35 d[k]=d[now]+e[j].val; 36 if (++c[k]>=n) return 0; 37 if (!inque[k]) 38 { 39 tail=(tail+1)%(n+1); 40 q[tail]=k; 41 inque[k]=1; 42 } 43 } 44 } 45 inque[now]=0; 46 } 47 return 1; 48 } 49 50 void add(int x,int y,int z) 51 { 52 e[++tot].s=x; e[tot].t=y; e[tot].val=z; 53 e[tot].next=fir[x]; fir[x]=tot; 54 } 55 56 int main() 57 { 58 //freopen("candy.in","r",stdin); 59 scanf("%d %d",&n,&m); 60 st=n+1; 61 //for (int i=1;i<=n;i++) add(st,i,0); 62 int x,y,z; 63 for (int i=1;i<=m;i++) 64 { 65 scanf("%d %d %d",&x,&y,&z); 66 if (x==1) add(y,z,0),add(z,y,0); 67 else 68 if (x==2) 69 { 70 if (y==z) {printf("%d\n",-1) ; return 0;} 71 add(y,z,1); 72 } 73 else 74 if (x==3) add(z,y,0); 75 else 76 if (x==4) 77 { 78 if (y==z) {printf("%d\n",-1) ; return 0;} 79 add(z,y,1); 80 } 81 else 82 if (x==5) add(y,z,0); 83 } 84 85 long long ans=0; 86 if (spfa()) 87 { 88 for (int i=1;i<=n;i++) ans+=d[i]; 89 printf("%lld\n",ans); 90 } 91 else printf("%d\n",-1); 92 return 0; 93 }
AC without art, no better than WA !