IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> HDU 4635强连通分量 -> 正文阅读

[PHP知识库]HDU 4635强连通分量

题目链接

http://acm.hdu.edu.cn/showproblem.php?pid=4635

题意

给出一张无向简单图,问保持其简单图性质且不生成强连通图的前提下,可以加多少边。若已经强连通,答案为-1.

思路

易想到一加边策略,不断加边直到最终只划分为两个点集,两点集内强连通,两点集间只有单向边。设其较小的点集大小为x,易知此时边数为n*(n-1)-(n-x)*x。将这个数减去本来边的数量即为答案。

显然(均值不等式)我们应令x最小化。我们求SCC并缩点,新图中所有入度为0或者出度为0的点可以作为大小为x的点集。挑选其最小的更新答案即可。

教训/收获

没注意到入度为0或出度为0才能满足条件。还是太菜,继续修炼

代码

#include<cstdio>
#include<iostream>
#include<iomanip>
#include<map>
#include<unordered_map>
#include<string>
#include<queue>
#include<stack>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib> 
#include<chrono>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define endl "\n"
#define int long long
//#define double long double
using namespace std;
	typedef long long ll;
	const int maxn=200505;
	const int inf=0x3f3f3f3f3f3f3f3f;
	int n,m,k;
    int dfn[maxn],low[maxn];
    bool in_sta[maxn];
    stack<int>sta;
    int S_id[maxn];
    int scc_size[maxn];
    int scc_cnt;
    int head[maxn],cnt;
    int dfn_cnt;
    int in[maxn],out[maxn];
    struct Edge{
        int from,to,val,next;
    }edge[maxn];
    void init(){
        memset(head,-1,sizeof head);
        memset(dfn,0,sizeof dfn);
        memset(low,0,sizeof low);
        memset(in_sta,0,sizeof in_sta);
        memset(scc_size,0,sizeof scc_size);
        memset(in,0,sizeof in);
        memset(out,0,sizeof out);
        cnt=0;scc_cnt=0;dfn_cnt=0;
        while(sta.size())   sta.pop();
    }
    void add(int u,int v,int w){
        edge[cnt]={u,v,w,head[u]};
        head[u]=cnt++;
    }
    void tarjan(int x){
        dfn[x]=low[x]=++dfn_cnt;
        sta.push(x);in_sta[x]=1;
        for(int i=head[x];~i;i=edge[i].next){
            int y=edge[i].to;
            if(!dfn[y]){
                tarjan(y);
                low[x]=min(low[x],low[y]);
            }
            else if(in_sta[y]){
                low[x]=min(low[x],dfn[y]);
            }
        }
        if(dfn[x]==low[x]){
            scc_cnt++;
            int z;
            do{
                z=sta.top();sta.pop();
                in_sta[z]=0;
                S_id[z]=scc_cnt;
                scc_size[scc_cnt]++;
            }while(z!=x);
        }
    }
	signed main(){
        IOS
		#ifndef ONLINE_JUDGE
		    freopen("IO\\in.txt","r",stdin);
		    freopen("IO\\out.txt","w",stdout);
        #endif
        init();
		int tn=1;
		cin>>tn;
        for(int ttn=1;ttn<=tn;ttn++){
            cin>>n>>m;
            init();
            cout<<"Case "<<ttn<<": ";
            k=m;
            while(k--){
                int u,v;
                cin>>u>>v;
                add(u,v,0);
            }
            for(int i=1;i<=n;i++)
                if(!dfn[i]) tarjan(i);
            if(scc_cnt==1){
                cout<<-1<<endl;
                continue;
            }
            for(int i=0;i<cnt;i++){
                int uid=S_id[edge[i].from];
                int vid=S_id[edge[i].to];
                if(uid==vid)    continue;
                in[vid]++;
                out[uid]++;
            }
            int mi=inf;
            for(int i=1;i<=scc_cnt;i++){
                if(!in[i]||!out[i]){
                    mi=min(mi,(n-scc_size[i])*scc_size[i]);
                }
            }
            int ans=n*(n-1)-mi-m;
            
            cout<<ans<<endl;
        }
	} 
						
  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-07-04 21:11:31  更:2021-07-04 21:11:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/6 17:52:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码