95pts 最后一个点wa 求助
查看原帖
95pts 最后一个点wa 求助
185026
NOIPer40楼主2020/12/2 14:51
#include<cstdio>
#include<cstring>
#include<queue>
#define maxn 5010
#define maxm 10010
using namespace std;
int n,m,head[maxn],nxt[maxm],to[maxm],wgh[maxm],cnt[maxn],flag,dis[maxn],vis[maxn];
queue<int> q;
void add(int u,int v,int w){
	nxt[++cnt[0]]=head[u];
	to[cnt[0]]=v;
	wgh[cnt[0]]=w;
	head[u]=cnt[0];
}
int main(){
	freopen("data.in","r",stdin);
	freopen("mine.out","w",stdout);
	memset(dis,0x3f,sizeof(dis));
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		int op,a,b,w;
		scanf("%d",&op);
		if(op==1){
			scanf("%d%d%d",&a,&b,&w);
			add(a,b,-w);
		}
		else if(op==2){
			scanf("%d%d%d",&a,&b,&w);
			add(b,a,w);
		}
		else{
			scanf("%d%d",&a,&b);
			add(a,b,0);
			add(b,a,0);
		}
	}
	for(int i=1;i<=n;i++)
		add(n+1,i,0);
	cnt[n+1]=0;
	dis[n+1]=0;
	q.push(n+1);
	while(!q.empty()){
		int f=q.front();
		q.pop();
		vis[f]=0;
		cnt[f]++;
		if(cnt[f]>=n+1){
			flag=1;
			break;
		}
		for(int i=head[f];i;i=nxt[i]){
			int ti=to[i],wi=wgh[i];
			if(dis[ti]>dis[f]+wi){
				dis[ti]=dis[f]+wi;
				if(!vis[ti]){
					vis[ti]=1;
					q.push(ti);
				}
			}
		}
	}
	if(flag)
		printf("No");
	else
		printf("Yes");
	return 0;
}
2020/12/2 14:51
加载中...