差分约束 70分TLE求调
查看原帖
差分约束 70分TLE求调
530797
code_hyx楼主2023/5/16 21:17
#include<bits/stdc++.h>
using namespace std;
long long h[200005],w[200005],vis[100005],dis[100005],e[200005],nxt[200005],ct[100005],cnt,n,k,ans=0;
void add(int x,int y,int z)
{
    e[++cnt]=y;
    w[cnt]=z;
    nxt[cnt]=h[x];
    h[x]=cnt;
}
int spfa(int s)
{
    memset(dis,-0x3f,sizeof(dis));
    memset(vis,0,sizeof(vis));
    memset(ct,0,sizeof(ct));
    deque<int> q;
    dis[s]=0;
    vis[s]=1;
    q.push_back(s);
    while(!q.empty())
    {
        int x=q.front();
        vis[x]=0; 
        q.pop_front();
        for(int i=h[x];i;i=nxt[i])
        {
            int j=e[i];
            if(dis[j]<dis[x]+w[i])
            {
                dis[j]=dis[x]+w[i];
                ct[j]=ct[x]+1;
                if(ct[j]>=n+1)return -1;
                if(!vis[j])
                {
                	//cout<<ct[j]<<" "; 
                    vis[j]=1;
                    if(q.size()&&dis[j]<dis[q.front()])q.push_front(j);
                    else q.push_back(j);
                }
            }
        }
    }
    return 0;
}
int main() 
{
    cin>>n>>k;
    for(int i=1;i<=k;i++)
    {
    	int x,y,z;
        cin>>x>>y>>z;
        if(x==1)
        {
        	add(y,z,0);
        	add(z,y,0);
		}
        if(x==2)add(y,z,1);
        if(x==3)add(z,y,0);
        if(x==4)add(z,y,1);
        if(x==5)add(y,z,0);
    }
    for(int i=1;i<=n;i++)add(0,i,1);
    if(spfa(0)==-1)cout<<-1;
    else
    {
    	for(int i=1;i<=n;i++)
		{
			ans+=dis[i];
			//cout<<dis[i]<<" ";
		}
 	  	cout<<ans;
	}
    return 0;
}
2023/5/16 21:17
加载中...