1 条题解
-
0Devil_Gary LV 6 @ 2017-07-04 16:59:29
简单查分约束
/* 作者:Devil_Gary 题目:p2404 糖果 */ #include<bits/stdc++.h> #define ll long long using namespace std; const ll maxn=100010; ll n,tot=1,k,flag,head[maxn],vis[maxn],dis[maxn]; queue<int>s; struct Edge { ll v,w,nxt; }e[maxn*2]; void bug() { cout<<"fk!!!"<<endl; } inline ll read() { ll f=1,x=0;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } void add(ll u,ll v,ll w) { e[++tot].v=v; e[tot].w=w; e[tot].nxt=head[u]; head[u]=tot; } void init() { n=read();k=read(); ll x,a,b; while(k--) { x=read();a=read();b=read(); switch(x) { case 1: add(a,b,0),add(b,a,0);break; case 2: add(a,b,1);if(a==b) flag=true;break; case 3: add(b,a,0);break; case 4: add(b,a,1);if(a==b) flag=true;break; case 5: add(a,b,0);break; } } } bool spfa() { for(ll i=1;i<=n;i++) s.push(i),vis[i]=dis[i]=1; while(!s.empty()) { ll u=s.front();s.pop(); if(dis[u]>n) { return 1; } for(ll i=head[u];i;i=e[i].nxt) { ll j=e[i].v; if(dis[u]+e[i].w>dis[j]) { dis[j]=dis[u]+e[i].w; if(!vis[j]) s.push(j),vis[j]=true; } } vis[u]=false; } return 0; } ll getsum() { ll x=0; for(ll i=1;i<=n;i++) x+=dis[i]; return x; } void work() { if(flag||spfa())cout<<-1<<endl; else cout<<getsum()<<endl; } int main() { init(); work(); }
- 1
信息
- 难度
- 7
- 分类
- (无)
- 标签
- 递交数
- 66
- 已通过
- 11
- 通过率
- 17%
- 被复制
- 1
- 上传者