SPFA20分求助

P1828 [USACO3.2] 香甜的黄油 Sweet Butter

~~为什么我的spfa和你的不一样~~
by 圣地亚哥 @ 2018-07-06 15:27:21


@[圣地亚哥](/space/show?uid=87453) ~~大概是因为我是空手打的吧~~优化之后70分,还是WA了3个点 ``` #include<iostream> #include<cstdio> #include<cstring> #define INF 0x7ffffff #define MAXN 800 using namespace std; int dist[801],bj[801],n,m,cow,h[801],cnt=0,head=1,tail=1,q[801],pl[501]; struct gh{ int boy; int next; int door; }a[3001]; void add(int x,int y,int c) { cnt++; a[cnt].boy=y; a[cnt].next=h[x]; a[cnt].door=c; h[x]=cnt; } int SPFA(int s) { memset(bj,0,sizeof(bj)); for(int i=1;i<=n;i++)dist[i]=INF;dist[s]=0; head=1,tail=1,q[head]=s; do { int x=q[head]; head=(head+1)%MAXN;bj[x]=0; for(int u=h[x];u;u=a[u].next) if(dist[x]+a[u].door<dist[a[u].boy]) { dist[a[u].boy]=dist[x]+a[u].door; if(!bj[a[u].boy]) { tail=(tail+1)%MAXN; q[tail]=a[u].boy; bj[a[u].boy]=1; } } } while(head!=tail); int total=0; for(int i=1;i<=cow;i++)total+=dist[pl[i]]; return total; } int main() { scanf("%d%d%d",&cow,&n,&m); for(int i=1;i<=cow;i++)scanf("%d",&pl[i]); for(int i=1,x,y,c;i<=m;i++) { scanf("%d%d%d",&x,&y,&c); add(x,y,c); add(y,x,c); } int minn=INF; for(int i=1;i<=n;i++) minn=min(minn,SPFA(i)); printf("%d",minn); } ```
by C201914 @ 2018-07-06 16:14:26


|