终于蹭了个并列最优解
查看原帖
终于蹭了个并列最优解
289296
zymooll楼主2021/10/7 15:31

全是优化。。。

#include<stdio.h>
#include<string.h>
#include<queue>
#include<cctype>
using namespace std;
int n,m,s,t;
struct Edge{
	int v,w,next;
}edge[20000];
int dis[2510],head[2510],cut;
priority_queue<pair<int,int> >q;
inline int read(){        
    int s=0;
    char ch=getchar();
    while(isdigit(ch)){
        s=s*10+ch-48;
        ch=getchar();
    }
    return s;
} 
inline void addEdge(int u,int v,int w){
	edge[++cut]={v,w,head[u]};
	head[u]=cut;
}
int main(){
	memset(dis,0x3f,sizeof(dis));
	n=read();m=read();s=read();t=read();
	for(register int i=0;i<m;++i){
		int u,v,w;
		u=read();v=read();w=read();
		addEdge(u,v,w);
		addEdge(v,u,w);
	}
	dis[s]=0;
	q.push(make_pair(0,s));
	while(!q.empty()){
		int u=q.top().second;
		q.pop();
		for(register int i=head[u];i;i=edge[i].next){
			int v=edge[i].v,w=edge[i].w;
			if(dis[v]>dis[u]+w){
				dis[v]=dis[u]+w;
				q.push(make_pair(-dis[v],v));
			}
		}
	}
	printf("%ld",dis[t]);
	return 0;
}
2021/10/7 15:31
加载中...