题解 P2299 【Mzc和体委的争夺战】

Shikita

2018-10-05 19:15:30

Solution

# 显而易见的一道单源最短路~~裸题~~ 题目就没什么可以解释的了,毕竟都看得出来是最短路 但是这个题目有坑啊 好吧现在我不说 ## 代码 ``` //Shikita #include<iostream> #include<queue> #include<cstdio> #include<cstring> using namespace std; const int N=2505,M=400005; int head[N],ver[M],edge[M],Next[M],d[N],f[2505][2505]; bool v[N]; int n,m,tot; struct node{int x,y;}ff; queue<node>qq; priority_queue< pair<int ,int> > q; int read() { int x=0,w=1;char ch=getchar(); while(ch>'9'||ch<'0') {if(ch=='-')w=-1;ch=getchar();} while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar(); return x*w; } void add(int x,int y,int z) { ver[++tot]=y,edge[tot]=z,Next[tot]=head[x],head[x]=tot; } void dijkstra() { memset(d,0x3f,sizeof(d)); memset(v,0,sizeof(v)); d[1]=0; q.push(make_pair(0,1)); while(q.size()) { int x=q.top().second; q.pop(); if(v[x]) continue; v[x]=1; for(int i=head[x];i;i=Next[i]) { int y=ver[i],z=edge[i]; if(d[y]>d[x]+z) { d[y]=d[x]+z; q.push(make_pair(-d[y],y)); } } } } int main() { n=read(),m=read(); for(int i=1;i<=m;i++) { int x=read(),y=read(),z=read(); if(f[x][y]==0) { f[x][y]=z; ff.x=x,ff.y=y; qq.push(ff); } else f[x][y]=min(f[x][y],z); } while(!qq.empty()) { ff=qq.front();qq.pop(); add(ff.x,ff.y,f[ff.x][ff.y]); add(ff.y,ff.x,f[ff.x][ff.y]); } dijkstra(); cout<<d[n]<<endl; } ``` 我们需要判重!!!!!! 因为数据的原因,如果不判重会WA第二个和第十个点 虽然我也不知道为什么 而且我的判重也非常丑陋。。。 好吧各位大佬就多多包含吧