2 条题解

  • 1
    @ 2025-2-7 9:32:11

    我又来发题解啦 用一下简单的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
    上传者