ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[Acwing]1165. 单词环 spfa判断负环+分数规划

2021-11-20 12:00:36  阅读:174  来源: 互联网

标签:1165 cnt ch dist int mid st spfa Acwing


前言

显然,这是一道分数规划问题
传送门 :

思路

分数规划,无非就是列出表达式,化简表达式,二分出答案这几个步骤

但是对于建边我们需要考虑优化,如果用全部单词建边的话显然 1 e 5 ∗ 1 e 5 1e5*1e5 1e5∗1e5失智。

题中有提到只考虑头尾两个那么我们就可以使用头尾两个建边即可

最后再 c h e c k check check的时候加一个边界判断即可

CODE

struct node
{
	int to,val;
};
vector<node> g[N];
char ch[1010];
double dist[N];
bool st[N];
int cnt[N];
queue<int> q;

void cal()
{

}

bool check(double mid){
    memset(st,0,sizeof st);
    memset(dist,0,sizeof dist); //求最长路
    memset(cnt,0,sizeof cnt);

    for(int i = 0;i < 676;++i){  
        q.push(i);
        st[i] = true;
    }

    dist[1] = 0;
    int count = 0;
    while(q.size()){
        int t = q.front();
        q.pop();

        st[t] = false;

            for(auto x :g[t]){
            int j = x.to;
            int w = x.val;


            if(dist[j] < dist[t] + w - mid * 1){
                dist[j] = dist[t] + w - mid * 1;
                cnt[j] = cnt[t] + 1;
               
                if(++count > 10000) return true; 
                if(cnt[j] >= N) return true;

                if(!st[j]){
                    q.push(j);
                    st[j] = true;
                }
            }
        }
    }
    return false;
}

void solve()
{
    while(cin>>n,n)
	{
		for(int i=1;i<=N;i++)
		g[i].clear();

		for(int i = 0 ;i<n;i++)
		{
			cin>>ch;
			int len = strlen(ch);

			if(len>=2 )
			{
				int a = (ch[0] - 'a') * 26 + (ch[1] - 'a');
                int b = (ch[len - 2] - 'a') * 26 + (ch[len - 1] - 'a');
        		g[a].pb({b,len});
			}
		}

		if(!check(0))
		{
			cout<<"No solution"<<endl;
		}
		else
		{
			double l  = 0 ,r=1000;
			while(r -  l>=eps)
			{

				double mid  = (l+r)/2;
				if(check(mid)) l = mid;
				else r=mid;
			}
			printf("%.2lf\n",r);

			//cout<<r<<endl;
		}
	}
}

标签:1165,cnt,ch,dist,int,mid,st,spfa,Acwing
来源: https://blog.csdn.net/qq_34364611/article/details/121437255

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有