图的子图求值问题

Problems in evaluating subgraphs of a graph

本文关键字:问题 子图      更新时间:2023-10-16

这是问题链接。

给定一个无向图。密度图<一口> | E | ⁄<子> V | | 。你的任务是选择一组非空的顶点V,使得在V上产生的子图具有最大的密度,并打印这个密度。但如果最大密度严格大于1,则只需打印">1"

最大顶点数:105
最大边数:105

我只是做了一个简单的解,但在这个解中,我可以跟踪整个图,但我如何得到更小的子图的密度值?

#include<iostream>
#include<vector>
using namespace std;
vector<int> adj[1000002];               // adjacency lists adj for storing graph edges
int node=0;                              // initializing for node value(vertices)
bool visited[100001]={false};            // keeps track of visited nodes(vertices) 
int edge=-1;
int ans=-1;
int n;                                  // keeps optimum value of no. of nodes
int e;                                   // keeps optimum value of no. of edges
void dfs(int s)
{
    node++;
    edge++;
    if(edge>0)                           
    {
        float dummy=(float)edge/(float)node;
        if(dummy>ans)
            {ans=dummy;
             e=edge;
             n=node;
            }
    }
    visited[s]=true;
    int t;
    for(int i=0;i!=adj[s].size();i++)
    { t=adj[s][i];
        if(visited[t]==false)
        {
           dfs(t);
        }
    }

}
int main()
{
    long long v,ed,i,j,x,y;
    cin>>v>>ed;
    for(long long k=0;k<ed;k++)
    {
        cin>>x>>y;
        adj[x].push_back(y);
        adj[y].push_back(x);
    }
     if(ed>v)
        cout<<">1"<<endl;
    else{
    for(i=1;i<=v;i++)
    {
        if(visited[i]==false)
        {
            node=0;
            edge=-1;
            dfs(i);
            //cout<<e<<"/"<<n<<endl;
        }
    }
   
    cout<<e<<"/"<<n<<endl;}
}

遵循以下步骤可以获得更好的效果:

1。对每个组件执行dfs以获得答案。

2。避免你正在做的浮点计算,尝试所有的整数计算。

3。没有理由在这里使用范围

long long

将代码修改成这样应该可以工作:

#include<iostream>
#include<vector>
using namespace std;
vector<int> adj[1000002];               // adjacency lists adj for storing graph edges
int node=0;                              // initializing for node value(vertices)
bool visited[100001]={false};            // keeps track of visited nodes(vertices) 
int edge=0;
void dfs(int s)
{
    node++;
    visited[s]=true;
    int t;
    edge+=adj[s].size();
    for(int i=0;i!=adj[s].size();i++)
    { 
        t=adj[s][i];
        if(visited[t]==false)
        {
           dfs(t);
        }
    }
}
int main()
{
    int v,ed,i,j,x,y;
    cin>>v>>ed;
    for(int k=0;k<ed;k++)
    {
        cin>>x>>y;
        adj[x].push_back(y);
        adj[y].push_back(x);
    }
    int mark[3]; mark[0]=mark[1]=mark[2]=0;
    int mx_node=0;
    for(i=1;i<=v;i++)
    {
        if(visited[i]==false)
        {
            node=0;
            edge=0;
            dfs(i);
            edge/=2;
            if(node>edge){ 
                mark[0]=1;
                mx_node=mx_node<node?node:mx_node;
            }
            else if(node==edge) mark[1]=1;
            else mark[2]=1;
        }
    }
    if(mark[2]) printf(">1n");
    else if(mark[1]) printf("1n");
    else printf("%d/%dn",mx_node-1,mx_node);
}