92分求助
查看原帖
92分求助
450498
miaozheyuan楼主2024/6/7 15:29

wa了T6

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

//定义  
#define int long long 
int vis[1000005], cnt, dis[1000005], b[1000005];
vector<int> g[1000005];
vector<int> v[1000005];
struct Node{
	int id, x;
}a[1000005];
vector<int> vis2[1005][1005];
/*
vis表示这个点有没有被访问,dis是第一个结果
b是第二个结果
g,v存图
a是堆
vis2[i][j]表示以经用i号药水加j号药水做出了哪些药水
*/
//结构体比较
bool operator<(Node x, Node y) {
	return x.x < y.x;
}
bool operator<=(Node x, Node y) {
	return x.x <= y.x;
}  
bool operator>(Node x, Node y) {
	return x.x > y.x;
} 
bool operator>=(Node x, Node y) {
	return x.x >= y.x;
} 
bool operator==(Node x, Node y) {
	return x.x == y.x;
} 

//出堆
void out() {
	a[1] = a[cnt];
	--cnt;
	int t = 1;
	while(1) {
		if(t * 2 > cnt) break;
		if(t * 2 == cnt) {
			if(a[t * 2] > a[t]) {
				break;
			} else {
				swap(a[t * 2], a[t]);
				t *= 2;
			}
		} 
		if(t * 2 + 1 <= cnt) {
			Node k = min(a[t * 2], a[t * 2 + 1]);
			if(k > a[t]) {
				break;
			} else {
				if(a[t * 2] < a[t * 2 + 1]) {
					swap(a[t], a[t * 2]);
					t *= 2;
				} else {
					swap(a[t], a[t * 2 + 1]);
					t = t * 2 + 1;
				}
			}
		}
	}
}
//入堆
void in(Node x) {
	a[++cnt] = x;
	int t = cnt;
	while(a[t] < a[t / 2] && t > 1) {
		swap(a[t], a[t / 2]);
		t /= 2;
	}
}

signed main() {
    //输入
	int n;
	cin >> n;
	for (int i = 0; i < n; ++i) {
		cin >> dis[i];
		in({i, dis[i]});
		b[i] = 1;
	}
	int a1, b1, c1;
	while(cin >> a1 >> b1 >> c1) {
		g[a1].push_back(b1);
		v[a1].push_back(c1);
		g[b1].push_back(a1);
		v[b1].push_back(c1);
	}
	//dijkstra
	while(cnt > 0) {
		Node u = a[1];
		out();
		if(vis[u.id] == 1) continue;
		vis[u.id] = 1;
		for (int j = 0; j < g[u.id].size(); ++j) {
			if(dis[g[u.id][j]] + dis[u.id] < dis[v[u.id][j]]) {
				dis[v[u.id][j]] = dis[g[u.id][j]] + dis[u.id];
				b[v[u.id][j]] = b[g[u.id][j]] * b[u.id];
				vis2[g[u.id][j]][u.id].push_back(v[u.id][j]);
				vis2[u.id][g[u.id][j]].push_back(v[u.id][j]);
				in({v[u.id][j], dis[v[u.id][j]]});
			} else if(dis[g[u.id][j]] + dis[u.id] == dis[v[u.id][j]]) {
			    int flag = 0;
			    for (int k = 0; k < vis2[u.id][g[u.id][j]].size(); ++k) {
			        if(v[u.id][j] == vis2[u.id][g[u.id][j]][k]) {
			            flag = 1;
			            break;
			        }
			    }
			    if(flag == 1) continue;
				b[v[u.id][j]] += b[g[u.id][j]] * b[u.id];
				vis2[g[u.id][j]][u.id].push_back(v[u.id][j]);
				vis2[u.id][g[u.id][j]].push_back(v[u.id][j]);
			}
		}
	}
	cout<< dis[0] << " " << b[0]; 
    return 0;
}
2024/6/7 15:29
加载中...