比赛 平凡的题目 评测结果 TTTTT
题目名称 平凡的皮卡丘 最终得分 0
用户昵称 Fmuckss 运行时间 5.000 s
代码语言 C++ 内存使用 2.38 MiB
提交时间 2015-11-03 11:54:11
显示代码纯文本
#include<stdio.h>
#include<queue>
#include<iostream>
#include<vector>
#include<algorithm>
#define maxn 40050
#define inf 1e+9
using namespace std;
typedef pair<int,int> pi;
int n,m,ans=inf;
int dis[maxn],dis2[maxn];
bool use[maxn],vis[maxn];
struct node{
	vector<int> ne;
	vector<int> v;
	vector<bool> cantuse;
}ns[maxn];
void beg(){
	for(int i=1;i<=maxn;i++){
		dis[i]=inf;
		use[i]=false;
	}
}
void read(){
	scanf("%d %d",&n,&m);
	for(int i=1;i<=m;i++){
		int x,y,xy,yx;
		scanf("%d %d %d %d",&x,&y,&xy,&yx);
		ns[x].ne.push_back(y);
		ns[x].v.push_back(xy);
		ns[x].cantuse.push_back(false);
		ns[y].ne.push_back(x);
		ns[y].v.push_back(yx);
		ns[y].cantuse.push_back(false);
	}
}
int dijkstra(int be,int en){
	beg();
	priority_queue< pi , vector< pi > , greater< pi > > q;
	dis[be]=0;
	q.push(make_pair(0,be));
	while(!q.empty()){
		int tmp=q.top().second,distmp=q.top().first;
		q.pop();
		if(tmp==en) return dis[en];
		use[tmp]=true;
		for(int i=0;i<ns[tmp].ne.size();i++){
			int j=ns[tmp].ne[i];
			if(ns[tmp].cantuse[i])continue;
			if(dis[j]>distmp+ns[tmp].v[i]){
				dis[j]=distmp+ns[tmp].v[i];
				if(!use[j])q.push(make_pair(dis[j],j));
			}
		}
	}
	return dis[en];
}
int dfs(int x){
	for(int i=0;i<ns[x].ne.size();i++){
		int tmp=ns[x].ne[i];
		if(vis[tmp])continue;
		ns[tmp].cantuse[i]=true;
		dis2[tmp]+=dis2[x]+ns[x].v[i];
		vis[tmp]=true;
		ans=min(ans,dis2[tmp]+dijkstra(tmp,1));
		dfs(tmp);
		vis[tmp]=false;
		dis2[tmp]-=dis2[x]+ns[x].v[i];
		ns[tmp].cantuse[i]=false;
	}
	return ans==inf ? -1:ans;
}
int solve(){
	for(int i=1;i<=n;i++){
		for(int j=0;j<ns[i].ne.size();j++){
	//		printf("%d->%d: dij:%d w:%d\n",i,ns[i].ne[j],dijkstra(i,ns[i].ne[j]),ns[i].v[j]);
			ans=min(ans,dijkstra(ns[i].ne[j],i)+ns[i].v[j]);
		}
	}

}
int main(){
	freopen("both.in","r",stdin);
	freopen("both.out","w",stdout);
	read();
	vis[1]=true;
	printf("%d",dfs(1));
	return 0;
}