UVA(769):关键环节答错

UVA(769) :critical links getting wrong answer

本文关键字:UVA      更新时间:2023-10-16

我正在解决UVA的关键链接问题。问题是如何在图中找到桥。我在这里用了同样的算法。但是我总是得到错误的答案。

请建议我的代码有什么问题。

//Bridges in a Graphs
#include<cstdio>
#include<cstring>
#include<iostream>
#include<vector>
#include<stack>
#include<utility>
#include<cstdlib>
#include<algorithm>
using namespace std;
#define MAX 205
int parent[MAX],timer=0,low[MAX],disc[MAX];
bool vis[MAX];
vector<pair<int,int> >st;
vector<vector<int> >G(MAX);
bool cmp(const pair<int,int> a,pair<int,int> b)
{
    if(a.first==a.second)
    return a.second<b.second;
    else
    return a.first<b.first;
}
void reset()
{
    st.clear();
    memset(parent,-1,sizeof parent);
    memset(vis,false,sizeof vis);
    for(int i=0;i<=MAX;i++)
    G[i].clear();
}
void dfs(int u)
{   
    vis[u]=true;
    disc[u]=low[u]=timer++;
    for(int i=0;i<G[u].size();i++)
    {
        int v=G[u][i];
        if(!vis[v])
        {
            parent[v]=u;
            dfs(v);
            low[u]=min(low[u],low[v]);
            if(low[v]>low[u])
            st.push_back(make_pair(min(u,v),max(u,v)));
        }
        else if(v!=parent[u])
            low[u]=min(low[u],disc[v]);
    }
}
int main()
{
    int n,t=0;
    while(cin>>n)
    {
        reset();
        if(t>0)
        cout<<endl;
        if(n==0)
        {
            cout<<"0"<<" critical linksn";break;
        }
        int node,count;
        for(int j=0;j<n;j++)
        {
            scanf("%d (%d)",&node,&count);
            for(int i=0;i<count;i++)
            {
                int x;
                scanf("%d",&x);
                G[node].push_back(x);
                G[x].push_back(node);
            }
        }
        for(int i=0;i<n;i++)
        {
            if(!vis[i])
            dfs(i);
        }
        sort(st.begin(),st.end(),cmp);
        cout<<st.size()<<" critical linksn";
        for(int i=0;i<st.size();i++)
        cout<<st[i].first<<" - "<<st[i].second<<endl;
        t++;
    }
}

我终于明白了,std::sort cmp功能有一点缺陷,它是

bool cmp(const pair<int,int> a,pair<int,int> b)
{
    if(a.first==b.first)
    return a.second<b.second;
    else
    return a.first<b.first;
}

也在dfs函数low[v]>disc[u]中代替low[v]>low[u]

相关文章:
  • 没有找到相关文章