kmjp's blog

競技プログラミング参加記です

yukicoder : No.1320 Two Type Min Cost Cycle

ちょっと戸惑ったけど、辺の制約を見直したら単純だった。
https://yukicoder.me/problems/no/1320

問題

辺に距離が付いたグラフが与えられる。
全辺無向辺か全辺有向辺かいずれかの形状をしている。
最小コストの閉路を求めよ。

解法

U→Vという辺を1個取り除いた時、それ以外の辺でV→Uに戻れるかをDijkstra法で求めて行こう。
辺の数が少ないので、取り除く辺を総当たりしても間に合う。

int T;
int N,M;
vector<pair<int,int>> E[2020];
int U[2020],V[2020],W[2020];
ll D[2020];

void solve() {
	int i,j,k,l,r,x,y; string s;
	
	cin>>T;
	cin>>N>>M;
	FOR(i,M) {
		cin>>U[i]>>V[i]>>W[i];
		U[i]--;
		V[i]--;
	}
	ll ret=1LL<<60;
	FOR(i,M) {
		FOR(j,N) {
			D[j]=1LL<<60;
			E[j].clear();
		}
		FOR(j,M) if(i!=j) {
			if(T==0) {
				E[U[j]].push_back({V[j],W[j]});
				E[V[j]].push_back({U[j],W[j]});
			}
			else {
				E[U[j]].push_back({V[j],W[j]});
			}
		}
		D[V[i]]=0;
		priority_queue<pair<ll,int>> Q;
		Q.push({0,V[i]});
		while(Q.size()) {
			ll co=-Q.top().first;
			int cur=Q.top().second;
			Q.pop();
			if(D[cur]!=co) continue;
			FORR(e,E[cur]) if(D[e.first]>co+e.second) {
				D[e.first]=co+e.second;
				Q.push({-D[e.first],e.first});
			}
		}
		ret=min(ret,W[i]+D[U[i]]);
	}
	if(ret>=1LL<<60) ret=-1;
	cout<<ret<<endl;
	
}

まとめ

辺の数がN(N-1)/2個あると勘違いして手間取ってしまった。