链式前向星+dijkstra,样例不过+70 pts?
查看原帖
链式前向星+dijkstra,样例不过+70 pts?
1268524
DX3906_ourstar楼主2024/8/1 11:30

link

#include<iostream>
#include<queue>
#include<cstring>
#define re register
using namespace std;

const int N = 1e4;

int n,m,d,cnt,a,b;
bool vis[N],mark[N][N];
int head[N],dis[N];
struct edge{
	int v,w,next;
	bool ok = true;
}e[N];

inline void add(int u,int v,int w){
	cnt ++;
	e[cnt].v = v;
	e[cnt].w = w;
	e[cnt].next = head[u];
	head[u] = cnt;
}

inline void dijkstra(){
	typedef pair<int,int> p;
	priority_queue<p,vector<p>,greater<p> > q;
	dis[a] = 0;
	vis[a] = true;
	q.push(make_pair(dis[a],a));
	while(! q.empty()){
		int u = q.top().second;
		q.pop();
		vis[u] = false;
		for(re int i = head[u];i != -1;i = e[i].next){
			int v = e[i].v;
			if(e[i].ok){
				if(dis[v] > dis[u] + e[i].w){
					dis[v] = dis[u] + e[i].w;
					if(! vis[v]){
						vis[v] = true;
						q.push(make_pair(dis[v],v));
					}
				}
			}else{
				dis[v] = dis[u];
			}
		}
	}
}

inline void cs(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	memset(head,-1,sizeof(head));
	memset(dis,0x3f,sizeof(dis));
}

int main(){
	cs();
	cin>>n>>m;
	for(re int i = 1;i <= m;i ++){
		int x,y,z;
		cin>>x>>y>>z;
		add(x,y,z);
		add(y,x,z);
	}
	cin>>d;
	for(re int i = 1;i <= d;i ++){
		int x,y;
		cin>>x>>y;
		int v = e[i].v,t = e[i].next;
		if( (x == v && y == t) || (x == t && y == v) ){
			e[i].ok = false;
		}
	}
	cin>>a>>b;
	dijkstra();
	cout<<dis[b]<<"\n";
	return 0;
}
2024/8/1 11:30
加载中...