int main() {
    int tc;
    cin >> tc;
    while (tc--) {
        int n, m;
        cin >> n >> m;
        AdjList.clear(); AdjList.resize(n);
        for (int i = 0; i < m; i++) {
            int a, b;
            cin >> a >> b;
            AdjList[a].push_back(ii(b, 0));
        }
        bool cac = true;
        int numScc = 0;
        dfs_num.clear(); dfs_num.resize(n, UNVISITED);
        dfs_parent.clear(); dfs_parent.resize(n, 0);
        for(int i = 0; i < n; i++) {
            if(dfs_num[i] == UNVISITED) {
                numScc++;
                if(graphCheck(i)) {
                    cac = false;
                    break;
                }
            }
        }
        if(cac && numScc == 1) cout << "YES\n";
        else cout << "NO\n";
    }
    return 0;
}
int main() {
    ios::sync_with_stdio(0);
    int n, m, q, tc = 0;
    while(cin >> n >> m >> q && (m || n || q)) {
        if(tc++) cout << endl;
        buildUfds(n);
        edges.clear();
        for(int i = 0; i < m; i++) {
            int a, b, d; cin >> a >> b >> d;
            edges.push_back(make_pair(d, make_pair(a - 1, b - 1)));
        }
        sort(edges.begin(), edges.end());
        graph.clear(); graph.resize(n);
        kruskal();
        cout << "Case #" << tc << endl;
        vvi memo(n, vi(n, -1));
        for(int i = 0; i < q; i++) {
            int a, b; cin >> a >> b;
            a--; b--;
            if(memo[a][b] != -1) {
                if(memo[a][b] == -2) cout << "no path\n";
                else cout << memo[a][b] << endl;
            }
            else if(memo[b][a] != -1) {
                if(memo[b][a] == -2) cout << "no path\n";
                else cout << memo[b][a] << endl;
            }
            else {
                des = b; ans = -inf;
                vis.clear(); vis.resize(n, 0);
                dfs(a);
                if (ans != -inf) {
                    cout << ans << endl;
                    memo[a][b] = memo[b][a] = ans;
                }
                else {
                    cout << "no path\n";
                    memo[a][b] = memo[b][a] = -2;
                }
            }
        }
    }
    return 0;
}
int main(){

    ios::sync_with_stdio(0);

    while(cin >> n && (n != -1)) {
        vec.clear();
        vec.resize(n);
        int enrgy, b, num;
        for (int i = 0; i < n; ++i) {
            cin >> enrgy >> num;
            for (int j = 0; j < num; ++j) {
                cin >> b;
                vec[i].push_back(ii(enrgy, b - 1));
            }
        }
        blmnfrd();
        vis.clear(); vis.resize(n , 0);
        dfs(0);
        vi vis1 = vis;

        if(dist[n - 1] > 0) cout << "winnable" << endl;
        else {
            bool happen = false;
            for (int i = 0; i < n && !happen; ++i)
                for (auto j : vec[i])
                    if (dist[j.second] < dist[i] + j.first && dist[i] + j.first > 0) {
                        vis.clear(); vis.resize(n,0);
                        dfs(i);
                        if (vis[n - 1] && vis1[i]) {
                            happen = true;
                            break;
                        }
                    }
            //if(chk())  cout << "winnable" << endl;
            if (happen) cout << "winnable" << endl;
            else cout << "hopeless\n";
        }
    }

    return 0;
}
예제 #4
0
int main(){


    ios::sync_with_stdio(0);
    int door,w,a;
    while(cin >> n && (n!=-1)){
        adjlist.clear();
        adjlist.resize(n);
        vis.clear(); vis.resize(n,0);
        for (int i = 0; i < n; ++i) {
            cin >> w >> door;
            while(door--){
                cin >> a;
                adjlist[i].push_back(ii(a-1,w));
            }
        }
        bellmanFord();

        if(dist[n-1] > 0) cout << "winnable\n";
        else{
            bool haspos = false;
            for (int i = 0; i < n && !haspos; ++i) {
                for(auto & e: adjlist[i]){
                    if(dist[i] + e.second > 0 && dist[e.first] < dist[i] + e.second){
                        vis.clear(); vis.resize(n,0);
                        dfs(i);
                        if(vis[n-1] ){
                            haspos = true;
                            break;
                        }
                    }
                }
            }
            if(haspos) cout << "winnable\n";
            else cout << "hopeless\n";
        }
    }

    return 0;
}
int main(){

    ios::sync_with_stdio(0);

    while (cin >> n >> k){
        vi speed(n);
        vec.clear(); vec.resize(100);
        for (int i = 0; i < n; ++i)
            cin >> speed[i];
        string a , chert;
        getline(cin , chert);
        map <int , int > m;
        for ( int i = 0; i < n; i++) {
            getline(cin, a);
            stringstream str(a);
            int num;
            vi tmp;
            while (str >> num)
                tmp.push_back(num), m[num] = 1;
            for (int ii = 0; ii < tmp.size(); ii++) {
                for (int j = ii + 1; j < tmp.size() ; j++) {
                    vec[tmp[ii]].push_back(make_pair(speed[i] * (tmp[j] - tmp[ii]), tmp[j]));
                    vec[tmp[j]].push_back(make_pair(speed[i] * (tmp[j] - tmp[ii]), tmp[ii]));
                }
            }
        }
        int ans = dijkstra();
        if(ans != inf) {
            if (k != 0)
                ans -= 60;
            cout << ans << endl;
        }

        else  cout << "IMPOSSIBLE\n";

    }

    return 0;
}