Dijkstra死循环了,是连边的问题吗?
查看原帖
Dijkstra死循环了,是连边的问题吗?
280473
404Not_Found楼主2021/7/13 11:42
#include<bits/stdc++.h>
using namespace std;
namespace IN{
	inline int read()
	{
		int x=0,f=1; char c=getchar();
		for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
		for(;isdigit(c);c=getchar()) x=(x<<1)+(x<<3)+c-48;
		return x*f; 
	}
}
#define MAXN 105
#define MAXM 10005
#define R register
namespace Graph{
	struct edge{
		int to,next,dis;
	} e[MAXM<<1];
	int head[MAXN],cnt;
	inline void add(int u,int v,int w)
	{
		e[++cnt].to=v;
		e[cnt].next=head[u];
		e[cnt].dis=w;
		head[u]=cnt;
	}
	struct node{
		int pos,dis;
		bool operator<(node x) const{ return x.dis<dis;}
	};
	priority_queue<node> q;
	int dis[MAXN];
	bool vis[MAXN];
	inline void Dijkstra(int s)
	{
		q.push(node{s,0});
		dis[s]=0;
		memset(dis,-1,sizeof(dis));
		memset(vis,0,sizeof(vis));
		while(!q.empty())
		{
			int u=q.top().pos;
			if(vis[u]) continue;
			vis[u]=1;
		
			for(R int i=head[u];i;i=e[i].next)
			{
				int v=e[i].to,w=e[i].dis;
				if(dis[v]>dis[u]+w)
				{
					dis[v]=dis[u]+w;
					if(!vis[v])
						q.push(node{v,dis[v]});
				}
			}
		}
	}
}
namespace Solve{
	int n,m,k,s,t;
	int cult[MAXN];
	int a[MAXN][MAXN];
	inline void init()
	{
		using IN::read;
		n=read();k=read();m=read();s=read();t=read();
		for(R int i=1;i<=n;i++) cult[i]=read();
		for(R int i=1;i<=k;i++)
			for(R int j=1;j<=k;j++)
				a[i][j]=read();
		for(R int i=1;i<=m;i++)
		{
			int u=read(),v=read(),d=read();
			if(!a[cult[v]][cult[u]]&&cult[u]!=cult[v]) Graph::add(u,v,d);
			if(!a[cult[u]][cult[v]]&&cult[u]!=cult[v]) Graph::add(v,u,d);
		}
	}
	inline int go()
	{
		init();
	    if(cult[s]==cult[t]) puts("-1");
	    else{
	    	Graph::Dijkstra(s);
	    	printf("%d\n",Graph::dis[t]);
		}
		return 0;
	}
}
int main()
{
	return Solve::go();
}
2021/7/13 11:42
加载中...