Untitled
unknown
c_cpp
2 years ago
1.3 kB
5
Indexable
#include <bits/stdc++.h>// talvez inverter para dist[maxn][53],criar um vetor de visitados using namespace std; typedef long long int ll; typedef pair<ll,ll>ii; typedef pair<ll,ii>iii; const int maxn=2e5+10; #define pb push_back vector<ii>adj[maxn]; ll n,m; ll dist[maxn][53];//menor dist pegando a aresta i para o vertice j; void dijkstra(){ priority_queue<iii,vector<iii>,greater<iii>> fila;//armazena dist total, de qual aresta veio, e vertice dist[1][0]=0; fila.push({0,{0,1}}); while(!fila.empty()){ ll custo=fila.top().first,edge=fila.top().second.first,x=fila.top().second.second; fila.pop(); for(int i=0; i<adj[x].size(); i++){ int xx=adj[x][i].first,c=adj[x][i].second; if(edge==0){ if(dist[xx][c]!=-1 and dist[xx][c]<=custo)continue; dist[xx][c]=custo; fila.push({custo,{c,xx}}); } else{ ll novo=(edge+c)*(edge+c); novo+=custo; if(dist[xx][0]!=-1 and dist[xx][0]<=novo)continue; dist[xx][0]=novo; fila.push({novo,{0,xx}}); } } } return; } int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> n>> m; memset(dist,-1,sizeof(dist)); for(int i=0; i<m; i++){ ll a,b,c;cin>>a>>b>>c; adj[a].pb({b,c}); adj[b].pb({a,c}); } dijkstra(); for(int i=1; i<=n; i++){ if(i!=1)cout<<' '; cout<< dist[i][0]; } cout<<endl; return 0; }
Editor is loading...