Dij死了?
查看原帖
Dij死了?
285617
黑影洞人楼主2022/3/8 16:53

RT,Dij70分

#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#define N 1414514
#define pii pair<int ,int >
#define mp make_pair
using namespace std;
int n,m,head[N],from[N],to[N],nxt[N],tot,dc[N],cnt,co[N],col,st[N],dfn[N],low[N],top,val[N];
int xs[N];
bool vis[N];
int he[N],ver[N],ne[N],va[N],tott,s,dis[N],ans=-0x7ff;
void add(int u,int v,int w,int d){
	to[++tot]=v;
	nxt[tot]=head[u];
	head[u]=tot;
	val[tot]=w;
	xs[tot]=d;
	from[tot]=u;
}
void add1(int u,int v,int w){
	ver[++tott]=v;
	ne[tott]=he[u];
	he[u]=tott;
	va[tott]=w;
}
void tarjan(int x){
	dfn[x]=low[x]=++cnt;
	st[++top]=x;
	for(int i=head[x];i;i=nxt[i]){
		int y=to[i];
		if(!dfn[y])tarjan(y),low[x]=min(low[x],low[y]);
		else if(!co[y])low[x]=min(low[x],dfn[y]);
	}
	if(low[x]==dfn[x]){
		co[x]=++col;
		while(st[top]!=x)co[st[top--]]=col;
		top--;
	}
}
void dijkstra(int s){
	priority_queue<pii>q;
	q.push(mp(dc[s],s));
	dis[s]=dc[s];
	while(!q.empty()){
		ans=max(ans,q.top().first);
		int x=q.top().second;q.pop();
		if(vis[x])continue;
		vis[x]=1;
		for(int i=he[x];i;i=ne[i]){
			int y=ver[i];
			if(dis[y]<dis[x]+va[i]+dc[y]){
				dis[y]=dis[x]+va[i]+dc[y];
				q.push(mp(dis[y],y));
			}
		}
	}
}
signed main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		int a,b,c;double d;
		scanf("%d%d%d%lf",&a,&b,&c,&d);
		add(a,b,c,d*10);
	}
	for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);
	for(int i=1;i<=m;i++){
		if(co[from[i]]==co[to[i]]){
			int sb=val[i];
			while(sb){
				dc[co[from[i]]]+=sb;
				sb=(sb*xs[i])/10;
			}
		}
		else add1(co[from[i]],co[to[i]],val[i]);
	}
	scanf("%d",&s);
	dijkstra(co[s]);
	for(int i=1;i<=col;i++)ans=max(ans,dis[i]);
	printf("%d",ans);
	return 0;
}
2022/3/8 16:53
加载中...