好霸气的理由:不想看题解。。。
by kgory @ 2019-11-14 20:56:00
@[以墨](/user/18993)
我也是90pts
帮帮我呗
```cpp
#include <stack>
#include <queue>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define reg register int
#define isdigit(x) ('0' <= x&&x <= '9')
template<typename T>
inline T Read(T Type)
{
T x = 0,f = 1;
char a = getchar();
while(!isdigit(a)) {if(a == '-') f = -1;a = getchar();}
while(isdigit(a)) {x = (x << 1) + (x << 3) + (a ^ '0');a = getchar();}
return x * f;
}
const int MAXN = 100010,MAXM = 200010;
struct EDGE
{
int v,w,_nxt;
}edge[MAXM << 1];
int cnt,_ori[MAXN];
inline void add(int u,int v,int w)
{
edge[++cnt].v = v;
edge[cnt]._nxt = _ori[u];
edge[cnt].w = w;
_ori[u] = cnt;
}
#define code_out {printf("No");exit(0);}
typedef long long ll;
bool vis[MAXN];
ll d[MAXN];
int used[MAXN],n,k;
inline void dijkstra(int s)
{
memset(d,-1,sizeof(d));
stack<int> q;
q.push(s),vis[s] = 1,d[s] = 0;
while(!q.empty())
{
int tp = q.top();q.pop();
if(used[tp] >= n) code_out
used[tp]++,vis[tp] = 0;
for(reg e = _ori[tp],v;e;e = edge[e]._nxt)
{
if(d[tp] + edge[e].w > d[v = edge[e].v])
{
d[v] = d[tp] + edge[e].w;
if(!vis[v]) q.push(v);
vis[v] = 1;
}
}
}
}
int main()
{
n = Read(1),k = Read(1);
for(reg i = 1;i <= k;i++)
{
int sit = Read(1),u = Read(1),v = Read(1),w;
switch(sit)
{
case 1:
w = Read(1);
if(v == u&&!w) code_out
add(v,u,w);
break;
case 2:
w = Read(1);
if(v == u&&!w) code_out
add(u,v,-w);
break;
case 3:
add(u,v,0),add(v,u,0);
break;
}
}
dijkstra(1);
printf("Yes");
return 0;
}
```
by 何もないです @ 2019-11-17 13:28:19