zoukankan      html  css  js  c++  java
  • 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
    网络流输出方案

  • 相关阅读:
    OLAP ODS项目的总结 平台选型,架构确定
    ORACLE ORA12520
    ORACLE管道函数
    ORACLE RAC JDBC 配置
    ORACLE RAC OCFS连接产生的错误
    ORACLE 启动和关闭详解
    OLAP ODS项目的总结 起步阶段
    ORACLE RAC 配置更改IP
    ORACLE RAC OCR cann't Access
    ORACLE RAC Debug 之路 CRS0184错误与CRS初始化
  • 原文地址:https://www.cnblogs.com/Creed-qwq/p/14719269.html
Copyright © 2011-2022 走看看