HDU 6005パンダランド(ダイクストラが最小のリングを見つける)

リンクリンク L個のI N K

質問:無向グラフを作成し、グラフで最小のリングを見つけてください。

アイデア:ダイクストラダイクストラを使用するd i j k s t r a最小のリングを探す、私はダイクストラの前に言った最小のリング見つけるためd i j k s t r aは有向グラフだけでなく、無向グラフも対象です。各エッジを列挙してから、このエッジを削除し、このエッジの始点をソースポイントとして使用し、ダイクストラを実行して回答を更新しますが、これはTLEになるため、プルーニングしてから、最短パスを見つけるためにdijします。ある瞬間に、最短経路が答えを超えた場合、それを要求する必要はありません。

時間の複雑さ:m ∗(n + m)log(n)m *(n + m)log(n)メートルn+m l o g n

コード:コード: c o d e

 #include <bits/stdc++.h>
#define ll long long
#define pi pair<int,int>
#define mk make_pair
#define pb push_back
using namespace std;
const int maxn = 4000*2+100;
int cnt;
map<pi,int>mp;
vector<pi>G[maxn];
int d[maxn],v[maxn];
void dij(int s,int val)
{
    
    
	priority_queue<pi>q;
	for(int i=1;i<=cnt;i++)d[i] = 0x3f3f3f3f,v[i]=0;
	q.push(mk(0,s));
	d[s] = 0;
	while(!q.empty())
	{
    
    
		int u = q.top().second;
		q.pop();
		if(d[u] > val)break;
		if(v[u])continue;
		v[u] = 1;
		for(int i=0;i<G[u].size();i++)
		{
    
    
			int v = G[u][i].first;
			int w = G[u][i].second;
			if(d[v] > d[u] + w)
			{
    
    
				d[v] = d[u] + w;
				q.push(mk(-d[v],v));
			}
		}
	}
}
int main()
{
    
    
	int T,kase=0;
	cin >> T;
	while(T--)
	{
    
    
		int n;
		scanf("%d",&n);
		cnt = 0;
		mp.clear();
		for(int i=1;i<=n;i++)
		{
    
    
			int x,y,tmp,tmp1;
			scanf("%d%d",&x,&y);
			if(mp[mk(x,y)]!=0)tmp = mp[mk(x,y)];
			else mp[mk(x,y)] = ++cnt,tmp = cnt;
			
			scanf("%d%d",&x,&y);
			if(mp[mk(x,y)]!=0)tmp1 = mp[mk(x,y)];
			else mp[mk(x,y)] = ++cnt,tmp1 = cnt;
			
			int w;
			scanf("%d",&w);
			G[tmp1].pb(mk(tmp,w));
			G[tmp].pb(mk(tmp1,w));
		}
		int ans = 0x3f3f3f3f;
		mp.clear();
		for(int u=1;u<=cnt;u++)
		{
    
    
			for(int j=0;j<G[u].size();j++)
			{
    
    
				
				int v=G[u][j].first;
				int w = G[u][j].second;
				if(mp[mk(u,v)]!=0)continue;
				mp[mk(u,v)] = mp[mk(v,u)] = 1;
				G[u][j].second = 0x3f3f3f3f;
				dij(u,ans-w);
				G[u][j].second = w;
				ans = min(ans,d[v] + w);
			}
		}
		printf("Case #%d: ",++kase);
		if(ans != 0x3f3f3f3f)printf("%d\n",ans);
		else puts("0");
		
		for(int i=1;i<=cnt;i++)G[i].clear();
	}
	return 0;
}

おすすめ

転載: blog.csdn.net/weixin_44499508/article/details/106869947