• 4.28华为机考


    差点机试翻车祭
    和xyy双排打华为实习的机试
    本来觉得这种机试大概就是瞎写一下半小时跑路的事情
    结果dijkstra+tarjan+dinic+乱七八糟的字符串处理差点给直接我送走
    最后两分钟AK甚至比区域赛还激动
    果然还是不能再这样摸鱼摸下去了啊

    T1
    直接建图最短路

    T2
    拓扑排序即可
    考场上nt了写了个tarjan找环。

    #include<bits/stdc++.h>
    #define N 2200000
    #define db double
    #define ll long long
    #define ldb long double
    #define ull unsigned long long
    using namespace std;
    const int h=3,ki=149,mo=998244353;
    int mod(int x){return (x%mo+mo)%mo;}
    int inc(int x,int k){x+=k;return x<mo?x:x-mo;}
    int dec(int x,int k){x-=k;return x>=0?x:x+mo;}
    int ksm(int x,int k)
    {
    	int ans=1;
    	while(k){if(k&1)ans=1ll*ans*x%mo;k>>=1;x=1ll*x*x%mo;}
    	return mod(ans);
    }
    int inv(int x){return ksm(x,mo-2);}
    int read()
    {
    	char ch=0;int x=0,flag=1;
    	while(!isdigit(ch)){ch=getchar();if(ch=='-')flag=-1;}
    	while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-'0',ch=getchar();}
    	return x*flag;
    }
    void write(int x)
    {
    	if(!x)return (void)putchar(48);
    	if(x<0)putchar(45),x=-x;
    	int len=0,p[20];
    	while(x)p[++len]=x%10,x/=10;
    	for(int i=len;i>=1;i--)putchar(p[i]+48);
    }
    struct edge{int to,nxt;}e[N];
    int num,head[N];
    inline void add(int x,int y){e[++num]={y,head[x]};head[x]=num;}
    stack<int>st;
    bool flag[N],in_stack[N];
    int times,tot,p[N],dfn[N],low[N];
    void tarjan(int x)
    {
    	dfn[x]=low[x]=++times;
    	st.push(x);in_stack[x]=true;
    	for(int i=head[x];i!=-1;i=e[i].nxt)
    	{
    		int to=e[i].to;
    		if(!dfn[to])tarjan(to),low[x]=min(low[x],low[to]);
    		else {if(in_stack[to])low[x]=min(low[x],dfn[to]);}
    	}
    	if(dfn[x]==low[x])
    	{
    		int u,len=0;
    		do
    		{	
    			u=st.top();st.pop();
    			p[++len]=u;in_stack[u]=false;
    		}while(x!=u);
    		if(len!=1)
    		{
    			tot+=len;
    			for(int i=1;i<=len;i++)flag[p[i]]=true;
    		}
    	}
    }
    string w[N];
    map<string,int>id;
    struct link{int x,y;}lk[N];
    
    struct node
    {
    	int dep;
    	string s;
    }ans[N];
    bool cmp(node a,node b)
    {
    	if(a.dep!=b.dep)return a.dep<b.dep;
    	else return a.s<b.s;
    }
    queue<int>q;
    int d[N],dep[N];
    bool vis[N];
    void dfs(int x)
    {
    	if(vis[x])return;
    	vis[x]=flag[x]=true;
    	for(int i=head[x];i!=-1;i=e[i].nxt){int to=e[i].to;dfs(to);}
    }
    int main()
    {
    	string x,y;
    	int n=read(),m=read(),sz=0;
    	num=-1;memset(head,-1,sizeof(head));
    	for(int i=1;i<=m;i++)
    	{
    		cin>>x>>y;
    		if(!id[x])id[x]=++sz,w[id[x]]=x;
    		if(!id[y])id[y]=++sz,w[id[y]]=y;
    		add(id[y],id[x]);lk[i]={id[y],id[x]};
    	}
    	for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);
    		
    	if(tot)printf("true
    ");
    	else printf("false
    ");
    	
    	for(int i=1;i<=n;i++)if(flag[i])dfs(i);
    	
    	
    	num=-1;memset(head,-1,sizeof(head));
    	for(int i=1;i<=m;i++)
    	{
    		int x=lk[i].x,y=lk[i].y;
    		if(!flag[x]&&!flag[y])add(x,y),d[y]++;
    	}
    	
    	
    	
    	for(int i=1;i<=n;i++)if(!flag[i]&&!d[i])q.push(i),dep[i]=1;
    	
    	int cnt=0;
    	while(!q.empty())
    	{
    		int x=q.front();q.pop();
    		ans[++cnt]={dep[x],w[x]};
    		for(int i=head[x];i!=-1;i=e[i].nxt)
    		{
    			int to=e[i].to;
    			if(--d[to]==0)dep[to]=dep[x]+1,q.push(to);
    		}
    	}
    	sort(ans+1,ans+cnt+1,cmp);
    	for(int i=1;i<=cnt;i++)cout<<ans[i].s<<" ";
    	return 0;
    }
    
    

    T3
    网络流输出方案

  • 相关阅读:
    FastCgi与PHP-fpm之间是个什么样的关系
    MySql的like语句中的通配符:百分号、下划线和escape
    mysql将int 时间类型格式化
    navicat 结合快捷键
    MySQL中concat函数
    case when then else end 用法
    PhpStorm主题
    Having与Where的区别
    无需图形界面环境下的浏览器
    Socket常见错误
  • 原文地址:https://www.cnblogs.com/Creed-qwq/p/14719269.html
Copyright © 2020-2023  润新知