QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#419659#1252. Floyd-WarshallDaiRuiChen007RE 0ms0kbC++141.8kb2024-05-24 08:24:252024-05-24 08:24:26

Judging History

This is the latest submission verdict.

  • [2024-05-24 08:24:26]
  • Judged
  • Verdict: RE
  • Time: 0ms
  • Memory: 0kb
  • [2024-05-24 08:24:25]
  • Submitted

answer

#include<bits/stdc++.h>
using namespace std;
const int MAXN=2005;
struct Edge { int v,w; };
vector <Edge> G[MAXN];
bool vis[MAXN];
int n,m,dis[MAXN],ans=0,ord[MAXN],deg[MAXN];
vector <int> f[MAXN];
priority_queue <array<int,2>,vector<array<int,2>>,greater<array<int,2>>> q;
void build(int s) {
	memset(dis,0x3f,sizeof(dis));
	memset(vis,0,sizeof(vis)),dis[s]=0;
	q.push({0,s});
	while(q.size()) {
		int u=q.top()[1]; q.pop();
		if(vis[u]) continue;
		vis[u]=true;
		for(auto e:G[u]) if(dis[e.v]>dis[u]+e.w) {
			q.push({dis[e.v]=dis[u]+e.w,e.v});
		}
	}
	memset(deg,0,sizeof(deg));
	memset(ord,0,sizeof(ord));
	for(int u=1;u<=n;++u) {
		f[u].clear();
		for(auto e:G[u]) if(dis[e.v]==dis[u]+e.w) {
			f[u].push_back(e.v),++deg[e.v];
		}
	}
	queue <int> Q;
	for(int i=1;i<=n;++i) if(!deg[i]) Q.push(i);
	for(int i=1;i<=n;++i) {
		int u=ord[i]=Q.front(); Q.pop();
		for(int v:f[u]) if(!--deg[v]) Q.push(v);
	}
}
bitset <MAXN> g[MAXN],ge[MAXN],suf[MAXN],tmp;
bool mk[MAXN];
signed main() {
	freopen("floyd.in","r",stdin);
	freopen("floyd.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i) for(int j=i;j<=n;++j) ge[i][j]=1;
	for(int i=1,u,v,w;i<=m;++i) scanf("%d%d%d",&u,&v,&w),G[u].push_back({v,w});
	for(int s=1;s<=n;++s) {
		memset(mk,0,sizeof(mk));
		build(s);
		for(int i=n;i>=1;--i) {
			int u=ord[i]; suf[u].reset(),suf[u][u]=1;
			for(int j:f[u]) suf[u]|=suf[j];
		}
		g[s][s]=1;
		for(int i:f[s]) {
			g[s][i]=1;
			for(int j:f[i]) g[s][j]=1;
		}
		for(int i:f[s]) if(i<s) tmp=g[i],tmp&=suf[i],g[s]|=tmp,mk[i]=1;
		for(int i=1;i<s;++i) {
			if(g[s][i]) {
				if(!mk[i]) tmp=g[i],tmp&=suf[i],tmp&=ge[i],g[s]|=tmp;
			} else if(vis[i]) ++ans;
		}
		for(int i=s+1;i<=n;++i) {
			if(g[s][i]) {
				for(int j:f[i]) if(j>i) g[s][j]=1;
			} else if(vis[i]) ++ans;
		}
	}
	printf("%d\n",ans);
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Dangerous Syscalls

input:

4 5
2 3 4
3 4 3
4 2 2
1 3 1
1 2 9

output:


result: