开开心心地写一道差分约束的题,但是不开心地发现只能拿90分???
Orz了一下dalao的题解,说有一个玄学的东西是最后加边的时候如果正的加就会T一个,反的就A了。
但是本弱反的加T了一个不同的,问问问???
然后加了个剪枝,加边的时候如果发现有要自己严格大于自己的熊孩子,就输出-1就行了,然后就A了。(面向 数据/标程 编程????
但实际上正解好像并不是这个。。。
#include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> #include <queue> using namespace std; const int N=300005; bool vis[N];int nxt[N],to[N],val[N],head[N],ecnt,n,K,dis[N],cnt[N]; void spfa() { vis[0]=1;queue<int>q; q.push(0); while(!q.empty()){ int u=q.front();q.pop();vis[u]=0; for(int i=head[u];i;i=nxt[i]) { if(dis[to[i]]<dis[u]+val[i]) { dis[to[i]]=dis[u]+val[i]; if(!vis[to[i]]) {vis[to[i]]=1,q.push(to[i]);cnt[to[i]]++;if(cnt[to[i]]==n-1) {puts("-1");exit(0);}} } } } } inline void add(int bg,int ed,int v) {nxt[++ecnt]=head[bg];to[ecnt]=ed;val[ecnt]=v;head[bg]=ecnt;} int main() { scanf("%d%d",&n,&K); int a,b,c; while(K--) { scanf("%d%d%d",&a,&b,&c); if(a==1) {add(b,c,0),add(c,b,0);} else if(a==2) {if(b==c){puts("-1");return 0;}add(b,c,1);} else if(a==3) add(c,b,0); else if(a==4) add(c,b,1); else if(a==5) add(b,c,0); } for(int i=n;i;i--) add(0,i,1); vis[0]=1; spfa();long long ans=0; for(int i=1;i<=n;i++) ans+=dis[i]; cout<<ans<<endl; }