Untitled

 avatar
unknown
c_cpp
2 years ago
1.4 kB
3
Indexable
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
#define int long long
#define all(a) begin(a),end(a)
#define pb push_back
#define pii pair<int,int>
#define F first
#define S second
#define mp make_pair
const int mod=998244353;
const int inf=1e18;
const int MAXN=100005;

vector<pii> Edge[MAXN],revEdge[MAXN],edge;
int d1[MAXN],d2[MAXN],L[MAXN];

void solve(){
	memset(d1,0x3f,sizeof(d1));
	memset(d2,0x3f,sizeof(d2));
	int n,m;
	cin >> n >> m;
	for(int i=0;i<m;i++){
		int u,v,l;
		cin >> u >> v >> l;
		Edge[u].pb({v,l});
		revEdge[v].pb({u,l});
		edge.pb({u,v});
		L[i]=l;
	}
	priority_queue<pii> q;
	q.push({0,1});
	d1[1]=0;
	while(!q.empty()){
		pii now=q.top();q.pop();
		if(d1[now.S]<now.F) continue;

		for(auto i:Edge[now.S]){
			if(d1[now.S]+i.S<d1[i.F]){
				d1[i.F]=d1[now.S]+i.S;
				q.push({d1[i.F],i.F});
			}
		}
	}

	q.push({0,2});
	d2[2]=0;
	while(!q.empty()){
		pii now=q.top();q.pop();
		if(d2[now.S]<now.F) continue;

		for(auto i:revEdge[now.S]){
			if(d2[now.S]+i.S<d2[i.F]){
				d2[i.F]=d2[now.S]+i.S;
				q.push({d2[i.F],i.F});
			}
		}
	}
	int ori=d1[2];
	for(int i=0;i<m;i++){
		int len=d1[edge[i].S]+d2[edge[i].F]+L[i];
		if(len<ori) cout << "HAPPY\n";
		else if(len==ori) cout << "SOSO\n";
		else cout << "SAD\n";
	}
}


signed main(){
	cin.sync_with_stdio(0),cin.tie(0);
	int N=1;
	//cin >> N;
	for(int i=1;i<=N;i++){
		solve();
	}
}
Editor is loading...