标签:sort a* 一个人 cout etc mat 三个点 block size
4 5
1 2 2
3 4 2
2 4 4
1 3 1
2 3 1
1 4
1 2
2
2 violethill
1 pink
violethill
4
//Serene #include<algorithm> #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<cmath> using namespace std; #define ull unsigned long long const int maxn=2e4+10,maxm=2e5+10; const ull INF=-1; int n,m; int mu[maxm],mv[maxm]; ull ms[maxm],ans=INF; bool modd[maxm],meven[maxm]; ull aa;char cc; ull read() { aa=0;cc=getchar(); while(cc<‘0‘||cc>‘9‘) cc=getchar(); while(cc>=‘0‘&&cc<=‘9‘) aa=aa*10+cc-‘0‘,cc=getchar(); return aa; } struct Pp{ int x;string s; }pp[maxn]; bool cmp(const Pp &a,const Pp &b) { return a.s<b.s; } int fir[maxn],nxt[maxm],to[maxm],e=0;ull v[maxm]; void add(int y,int x,int z) { to[++e]=y;nxt[e]=fir[x];fir[x]=e;v[e]=z; } ull dis[maxn]; int zz[maxn]; bool vis[maxn]; void spfa(int st){ memset(dis,-1,sizeof(dis)); int s=1,t=0,x,y,z; dis[st]=0;zz[++t]=st;vis[st]=1; while(s<=t) { x=zz[s%maxn];s++;vis[x]=0; for(y=fir[x];y;y=nxt[y]) { z=to[y]; if(dis[z]<=dis[x]||dis[z]<=dis[x]+v[y]) continue; dis[z]=dis[x]+v[y]; if(!vis[z]) { vis[z]=1;t++; zz[t%maxn]=z; } } } } int main() { n=read();m=read(); for(int i=1;i<=m;++i) { mu[i]=read();mv[i]=read(); ms[i]=read(); } int x=read(),y; for(int i=1;i<=x;++i) { y=read();modd[y]=1; } x=read(); for(int i=1;i<=x;++i) { y=read();meven[y]=1; } for(int i=1;i<=m;++i) { if(!modd[i]) add(mu[i],mv[i]+n,ms[i]); if(!meven[i]) add(mu[i]+n,mv[i],ms[i]); if(modd[i]&&meven[i]) { add(mu[i]+n,mv[i],ms[i]); add(mu[i],mv[i]+n,ms[i]); } } add(n,2*n+1,0);add(2*n,2*n+1,0); x=read(); for(int i=1;i<=x;++i) { pp[i].x=read(); cin>>pp[i].s; } sort(pp+1,pp+x+1,cmp); spfa(2*n+1);y=0; for(int i=1;i<=x;++i) { if(dis[pp[i].x]<ans) { y=i;ans=dis[pp[i].x]; } } cout<<pp[y].s<<"\n"; cout<<ans; return 0; }
标签:sort a* 一个人 cout etc mat 三个点 block size
原文地址:http://www.cnblogs.com/Serene-shixinyi/p/7531821.html