95分求调
  • 板块P2683 小岛
  • 楼主北文
  • 当前回复8
  • 已保存回复8
  • 发布时间2023/3/23 08:48
  • 上次更新2023/10/23 20:48:40
查看原帖
95分求调
53769
北文楼主2023/3/23 08:48
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n, w[2505][2505], dis[10005], v[10005], pre[10005], road[10005], len, x, y;
int ans=1e12, q;
void dij(int s) {
	for(int i=0; i<=n; i++) {
		dis[i]=1e12;
		v[i]=0;
	}
	dis[s]=0;
	for(int i=1; i<=n; i++) {
		int u=0;
		for(int j=1; j<=n; j++)
			if(v[j]==0&&dis[j]<dis[u])
				u=j;
		if(u==0)break ;
		v[u]=true;
		for(int j=1; j<=n; j++) {
			if(w[u][j]&&dis[j]>dis[u]+w[u][j]) {
				dis[j]=dis[u]+w[u][j];
			}
		}
	}
}
signed main(){
	cin>>n>>q;
	memset(w, 0x3f, sizeof(w));
	for(int i=1; i<=q; i++) {
		int t;
		cin>>t;
		if(t==0) {
			int u, v;
			cin>>u>>v;
			dij(u);
			if(dis[v]==1e12) printf("-1\n");
			else
			printf("%lld\n", dis[v]);
		}
		else {
			int u, v, c;
			cin>>u>>v>>c;
			w[u][v]=min(w[u][v], c);
			w[v][u]=min(c, w[v][u]);
		}
	}
	
	return 0;
}
2023/3/23 08:48
加载中...