2 条题解
-
1
我又来发题解啦 用一下简单的SPFA就好了 再加点判断就完美了
#include <bits/stdc++.h> using namespace std; int n, k; struct Edge {int u, v, w;}; vector<Edge> adj[100005]; int inq[100005], cnt[100005], dis[100005]; bool SPFA() { queue<int>q; for(int i=1;i<=n;i++){ dis[i]=1; inq[i]=1; q.push(i); } while (!q.empty()) { int u = q.front(); q.pop(); inq[u] = 0; for (auto e : adj[u]) { if (dis[e.v] < dis[u] + e.w) { dis[e.v] = dis[u] + e.w; cnt[e.v] ++; if (cnt[e.v] >= n) return true; if (!inq[e.v]) { q.push(e.v); inq[e.v] = 1; } } } } return false; } int main() { cin >> n >> k; for (int i = 1; i <=k; i++) { int x,u,v; cin>>x>>u>>v; if(x%2==0&&u==v){ cout<<-1; return 0; } else if(x==1){ adj[u].push_back({u,v,0}); adj[v].push_back({v,u,0}); } else if(x==2){ adj[u].push_back({u,v,1}); } else if(x==3){ adj[v].push_back({v,u,0}); } else if(x==4){ adj[v].push_back({v,u,1}); } else if(x==5){ adj[u].push_back({u,v,0}); } } if (SPFA()) { cout << -1; return 0; } long long ans=0; for(int i=1;i<=n;i++){ ans+=dis[i]; } cout<<ans; return 0; }
信息
- ID
- 1648
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 7
- 标签
- 递交数
- 29
- 已通过
- 7
- 上传者