比赛 东方版NOIP模拟赛 评测结果 AAAAAAAAATAAAATATTTT
题目名称 Yuyuko 最终得分 70
用户昵称 Neptune 运行时间 26.791 s
代码语言 C++ 内存使用 1.38 MiB
提交时间 2015-10-28 19:34:14
显示代码纯文本
#include<stdio.h>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
struct node {int x,s;};
int n,m;
int dis[30010],mark[30010];
vector <node> ns[30010];
vector <int> marki[30010];
queue <int> q;
int N;
int father[30010],ans[30010],haha=2100000000;
void clear(int x)
{
   for(int i=1;i<=n;i++)
      dis[i]=1500000000;
   dis[x]=0;
}
void clearmarki()
{
   for(int i=1;i<=n;i++)
      if(marki[i].size())
	     marki[i].clear();
}
int check(int x,int y)
{
   for(int i=0;i<marki[x].size();i++)
   {
      if(marki[x][i]==y)return 1;
   }
   return 0;
}
int SPFA(int x,int y)
{
   clear(x);
   q.push(x);
   mark[x]=1;
   while(!q.empty())
   {
      N=q.front();
	  q.pop();
	  mark[N]=0;
	  for(int i=0;i<ns[N].size();i++)
	  {
	      if(check(N,ns[N][i].x))continue;
	      if(dis[ns[N][i].x]>dis[N]+ns[N][i].s)
		  {
		  	 if(y)father[ns[N][i].x]=N;
		     dis[ns[N][i].x]=dis[N]+ns[N][i].s;
		     if(!mark[ns[N][i].x])
			 {
			     mark[ns[N][i].x]=1;
			     q.push(ns[N][i].x);
			 }
		  }
	  } 
   }
   return 0;
} 
node shit;
void insert(int x,int y,int z)
{
   shit.x=y;
   shit.s=z;
   ns[x].push_back(shit);
}
void search(int x)
{
   if(father[x]==x)return ;
   marki[x].push_back(father[x]);
   marki[father[x]].push_back(x);
   search(father[x]);
   return ;
}
int main()
{
   freopen("zaw.in","r",stdin);
   freopen("zaw.out","w",stdout);
   int x1,x2,x3,x4;
   scanf("%d %d",&n,&m);
   for(int i=1;i<=m;i++)
   {
      scanf("%d %d %d %d",&x1,&x2,&x3,&x4);
      insert(x1,x2,x3);
      insert(x2,x1,x4);
   }
   for(int i=1;i<=n;i++)
      father[i]=i;
   SPFA(1,1);
   for(int i=2;i<=n;i++)ans[i]=dis[i];
   for(int i=2;i<=n;i++)
   {
      if(ans[i]!=1500000000)
	  {
	  	 clearmarki();
	  	 search(i);
	     SPFA(i,0);
	     if(dis[1]==1500000000)continue;
	     haha=min(haha,ans[i]+dis[1]);
	  }
   }
   if(haha!=2100000000)printf("%d",haha);
   else printf("-1");
}