NC204867. 旅旅旅游
描述
牛牛国有 个城市, 条无向道路,每条道路三个属性 ,表示城市 与城市 之间有一条长为 的道路,现在牛可乐在城市 ,他想去城市 。同时牛可乐非常聪明,他会将所有从1到 可能的最短路径全都走一遍,之后便不再走了。
现在牛妹在城市 ,他想把所有城市走一遍,可是他不想走牛可乐走过的路,牛妹不知道他能不能将所有城市全走一遍,你能告诉她吗?
输入描述
第一行两个数字 ,表示城市的数量和道路的数量。
接下来 行,每行 个数字 ,表示城市 与城市 之间有一条长为 的道路 (题目保证无自环,可能有重边)
输出描述
如果牛妹能走遍所有城市,输出 “YES” ,否则输出 “NO”。
示例1
输入:
4 5 1 2 2 1 3 2 2 3 1 2 4 2 3 4 1
输出:
YES
说明:
C++11(clang++ 3.9) 解法, 执行用时: 640ms, 内存消耗: 41620K, 提交时间: 2020-04-19 13:39:42
#include<bits/stdc++.h> using namespace std; const int N = 1e5+7; long long d1[N],d2[N]; int fa[N],n,m; struct node{ int t; long long c; bool operator<(const node & rs)const{ return c>rs.c; } }; struct edge{ int x,y,w; }E[500005]; vector<node>vec[N]; int find(int u){ if(u==fa[u])return u; return fa[u] = find(fa[u]); } void dij(int s,long long d[]){ priority_queue<node>q; for(int i = 1;i<=n;i++)d[i] = 1e18; d[s] = 0; q.push({s,0}); while(!q.empty()){ node x = q.top();q.pop(); if(d[x.t]<x.c)continue; for(int i = 0;i<vec[x.t].size();i++){ node e = vec[x.t][i]; if(d[e.t]>x.c+e.c){ d[e.t]=x.c+e.c; q.push({e.t,d[e.t]}); } } } } int main(){ int a,b,c; scanf("%d%d",&n,&m); for(int i = 0;i<m;i++){ scanf("%d%d%d",&a,&b,&c); vec[a].push_back({b,c}); vec[b].push_back({a,c}); E[i] = {a,b,c}; } dij(1,d1);dij(n,d2); for(int i = 1;i<=n;i++)fa[i] = i; int cnt = n; for(int i = 0;i<m;i++){ if(d1[E[i].x]+E[i].w+d2[E[i].y]==d1[n]||d2[E[i].x]+E[i].w+d1[E[i].y]==d1[n])continue; int u = find(E[i].x),v=find(E[i].y); if(u!=v){ fa[u] = v; cnt--; } } if(cnt==1)printf("YES\n"); else printf("NO\n"); return 0; }
C++14(g++5.4) 解法, 执行用时: 1127ms, 内存消耗: 51984K, 提交时间: 2020-04-20 12:10:21
#include<bits/stdc++.h> using namespace std; const int N=1e5+5,M=5e5+5; typedef long long ll; ll d1[N],d2[N]; int n,m,s[N]; struct node{ ll d; int id; bool operator<(const node &a)const{ return d>a.d; } }now; vector<node>vi[N]; struct edge{ int u,v,w; }e[M]; void dij(int x,ll dis[]){ for(int i=1;i<=n;i++) dis[i]=1e15; dis[x]=0; priority_queue<node>q; q.push({dis[x],x}); while(q.size()){ now=q.top();q.pop(); if(dis[now.id]<now.d) continue; int u=now.id; for(auto it:vi[u]){ int v=it.id,w=it.d; if(dis[v]>dis[u]+w) dis[v]=dis[u]+w,q.push({dis[v],v}); } } } int main(){ scanf("%d%d",&n,&m); for(int i=1,u,v,w;i<=m;i++){ scanf("%d%d%d",&u,&v,&w); vi[u].push_back({w,v}); vi[v].push_back({w,u}); e[i]={u,v,w}; } dij(1,d1); dij(n,d2); ll mn=d1[n]; set<int>sz; for(int i=1;i<=n;i++) s[i]=i; for(int i=1;i<=m;i++){ if(d1[e[i].u]+d2[e[i].v]+e[i].w==mn||d1[e[i].v]+d2[e[i].u]+e[i].w==mn) continue; sz.insert(e[i].u),sz.insert(e[i].v); } puts(sz.size()==n?"YES":"NO"); return 0; }