莫名就wa了
查看原帖
莫名就wa了
498531
jianglige楼主2022/1/30 22:54

rt,样例过了莫名就wa了

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<cstdio>
#include<queue>
using namespace std;
queue<int> q;
inline int read(){
	char c;int f=1,res=0;
	while(c=getchar(),!isdigit(c)) if(c=='-') f*=-1;
	while(isdigit(c)) res=res*10+c-'0',c=getchar();
	return res*f;
}
const int maxn=5005;
int n,m,opt;
int ver[maxn],hd[maxn],nxt[maxn],w[maxn],dis[maxn],num[maxn];
bool vis[maxn];
int cnt=1;
inline void add_edge(int u,int v,int d){
	ver[++cnt]=v;w[cnt]=d;
	nxt[cnt]=hd[u];hd[u]=cnt;
}
inline bool spfa(int node){
	dis[node]=0;
	q.push(node);
	vis[node]=true;
	num[node]++;
	while(!q.empty()){
		int u=q.front();
		q.pop();
		vis[u]=false;
		for(int i=hd[u];i;i=nxt[i])
			if(dis[ver[i]]>dis[u]+w[i]){
				dis[ver[i]]=dis[u]+w[i];
			
			   if(!vis[ver[i]]){
				 q.push(ver[i]);
				 vis[ver[i]]=true;
				 num[ver[i]]++;
				 if(num[ver[i]]==n+1)
				   return false;
		     	}
			}
		
	} 
	return true;
}

int main(){
	n=read();
	m=read();
	memset(dis, 0x3f3f3f3f, sizeof(dis));
	for(int i=1;i<=m;i++){
		opt=read();
		if(opt==1) {
			int a,b,c;
			a=read();
			b=read();
			c=read();
			add_edge(a,b,-c);
		}
		if(opt==2)           //dis[a]-dis[b]<=c
        {   int a,b,c;  
		    a=read();b=read();c=read();             //dis[b]-dis[a]>=-c 
			add_edge(b,a,c);//等价于b到a有一条边权为c
		}
		if(opt==3){           //dis[a]=dis[b]
			  int a,b;        //dis[a]<=dis[b]+0
			  a=read();b=read();
			  add_edge(b,a,0);
			  add_edge(a,b,0);//dis[b]<=dis[a]+0
		}
	}
	for(int i=1;i<=n;i++){
		add_edge(n+1,i,0);
	}
	bool flag=spfa(n+1);
	if(spfa(n+1)==false) cout<<"No";
	else{
		cout<<"Yes";
	}
	return 0;
}
2022/1/30 22:54
加载中...