蒟蒻求助,样例输出极大值QWQ//C++
查看原帖
蒟蒻求助,样例输出极大值QWQ//C++
532946
melons_sundae楼主2023/7/8 11:08
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define t 1000005
bool flag[t];
int n,m,x,y,z;
int top,st[t];
bool vis[t];
int o[t];
int ans;
int a[t],b[t],c[t];
struct enode {
	int to,nxt,value;
}e[t];
int cnt,head[t];
int id,num,idx[t],low[t],dfn[t];
void add1(int u,int v) {
	e[++cnt].to=v;
	e[cnt].nxt=head[u];
	head[u]=cnt;
	return;
}
void add2(int u,int v,int w) {
	e[++cnt].to=v;
	e[cnt].nxt=head[u];
	e[cnt].value=w;
	head[u]=cnt;
	return;
}
struct node {
	int xx,yy;
	bool operator>(const node& a)const {
		return xx>a.xx;
	}
};
void dfs(int u) {
	st[++top]=u;
	flag[u]=true;
	low[u]=dfn[u]=++id;
	for(int i=head[u];i;i=e[i].nxt) {
		int v=e[i].to;
		if(!dfn[v]) {
			dfs(v);
			low[u]=min(low[u],low[v]);
		}
		else if(flag[v]) low[u]=min(low[u],dfn[v]);
	}
	if(low[u]==dfn[u]) {
		num++;
		while(true) {
			int v=st[top--];
			flag[v]=false;
			idx[v]=num;
			if(u==v) break;
		}
	}
	return;
}
void dijkstra(int v) {
	priority_queue<node,vector<node>,greater<node> > q;
	memset(o,0x3f3f3f3f,sizeof(o));
	o[v]=0;
	q.push({0,v});
	while(!q.empty()) {
		int tmp=q.top().yy;
		q.pop();
		if(vis[tmp]) continue;
		vis[tmp]=true;
		for(int i=head[tmp];i;i=e[i].nxt) {
			int tx=e[i].to,ty=e[i].value;
			if(o[tx]>o[tmp]+ty) {
				o[tx]=o[tmp]+ty;
				q.push({o[tx],tx});
			}
		}
	}
	return;
}
signed main() {
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=m;i++) {
		scanf("%lld%lld%lld",&a[t],&b[t],&c[t]);
		add1(a[t],b[t]);
	}
	for(int i=1;i<=n;i++)
		if(!dfn[i])
			dfs(i);
	memset(head,0,sizeof(head));
	memset(e,0,sizeof(e));
	cnt=0;
	for(int i=1;i<=m;i++)
		if(idx[a[i]]!=idx[b[i]])
			add2(idx[a[i]],idx[b[i]],c[i]);
	dijkstra(idx[1]);
	printf("%lld",o[idx[n]]);
	return 0;
}
2023/7/8 11:08
加载中...