求助RE
查看原帖
求助RE
151647
sycqwq楼主2022/8/3 19:18

rt

#include<bits/stdc++.h> 
#define int long long
using namespace std;
const int inf=192608170000000,maxn=10005;
int n,m,s,t;
struct node
{
	int v,w,nxt,c;
}e[2000005];
int tot=1;
int head[2000005];
int add(int u,int v,int w,int c)
{
	e[++tot]=(node){v,w,head[u],c},head[u]=tot;
    e[++tot]=(node){u,0,head[v],-c},head[v]=tot;
}	
deque<int> q;
int dis[maxn],bk[maxn],pre[maxn],zz;
inline int spfa()
{
	while(!q.empty())
		q.pop_front();
	memset(pre,0,sizeof pre); 
	memset(bk,0,sizeof bk);
	memset(dis,0x7f,sizeof dis);
	q.push_front(1);
//	for(int i=1;i<=n;i++)
//		cout<<dis[i]<<endl;
	dis[1]=0;
	bk[1]=1;
	while(!q.empty())
	{
		register int x=q.front();
		bk[x]=0;
		q.pop_front();
		for(register int i=head[x];i;i=e[i].nxt)
		{
			register int v=e[i].v;
//			cout<<v<<endl;
//			cout<<v<<' '<<e[i].w<<' '<<dis[x]<<' '<<bk[v]<<' '<<dis[v]<<endl;
			if(e[i].w>0&&dis[v]>dis[x]+e[i].c )
			{
//				cout<<"QWQ"<<endl;
				dis[v]=dis[x]+e[i].c;
				if(!bk[v])
				{
					if(!q.empty())
					{
						if(dis[q.front()]>dis[v])
							q.push_front(v);
						else
							q.push_back(v);
					}
					else
						q.push_front(v);
//					q.push(v);
				}
				pre[v]=i;
				bk[v]=1;
			}
		}
	}
//	cout<<dis[n]<<endl;
	return dis[t]<=1926081719260817;
}
int cnt1,a1[maxn],tp[maxn],a2[maxn],qwq[maxn<<3];
queue<int> s1;
stack<int> s2;
string qaq[maxn<<3];
void dfs(int x)
{
    bk[x]=1;
    if(qwq[x])
        cout<<qaq[qwq[x]]<<endl;
    for(int i=head[x];i;i=e[i].nxt)
    {
        int v=e[i].v;
        if(!bk[v]&&!e[i].w)
            dfs(v);
    }
}
void dfs2(int x)
{
    bk[x]=1;
    for(int i=head[x];i;i=e[i].nxt)
    {
        int v=e[i].v;
        if(!e[i].w&&!bk[v])
            dfs2(v);
    }
    if(qwq[x]&&qwq[x]!=n)
        cout<<qaq[qwq[x]]<<endl;
}
map<string,int> mp;
signed main(){
		tot=1;
	cin>>n>>m;
    s=2*n+1;
    t=2*n;
	for(int i=1;i<=n;i++)
	{
        string a;
        cin>>a;
        qaq[i]=a;
        a1[i]=++cnt1;
        a2[i]=++cnt1;
        qwq[a1[i]]=i; 
        mp[a]=i;
        add(a2[i],a1[i],1,0);
    }
    add(s,a1[1],2,0);
    for(int i=1;i<=m;i++)
    {
        string a,b;
        cin>>a>>b;
        int x=mp[a],y=mp[b];
        if(x>y)
            swap(x,y);
        add(a1[x],a2[y],1,-1); 
        // cout<<x<<' '<<y<<endl;
    }
	int ans=0,s=0;
	while(spfa())
	{
//		++zz;
//		cout<<"QWQ"<<endl;
		register int mi=1926081719260817,x=t;
//		cout<<pre[1]<<endl;
		while(x!=1)
		{
			mi=min(e[pre[x]].w,mi); 
			x=e[pre[x]^1].v; 
		}
		x=t;
		while(x!=1)
		{
			int v=pre[x];
			e[pre[x]].w-=mi;
			e[pre[x]^1].w+=mi;
			ans+=e[pre[x]].c*mi;
//			cout<<e[v].w<<endl;
//			cout<<x<<endl;
			x=e[pre[x]^1].v;
		}
//		cout<<mi<<endl;
		s+=mi;
	}
    if(s!=2)
    {
        cout<<"No Solution!";
        return 0;
    }

	cout<<-ans<<endl;
    dfs(1);
    dfs2(1);
	return 0;
}
2022/8/3 19:18
加载中...