标签:
2 2 2 1 2 13 2 1 33 4 6 1 2 10 2 1 60 1 3 20 3 4 10 2 4 5 4 1 50
46 210
/* 这题一直Memory limit Exceeded 开的变量太大了, 再开一个vector<node> s;就不行 而开三个int类型[1000002]的数组就可以 总之以后,容器不能用太多。。。 */ #include <iostream> #include<cstdio> #include<vector> #include<cstring> #include<queue> using namespace std; bool vis[1000002]; struct node { int num,d; node(int a,int b){num=a; d=b;} }; vector<node> s[1000002]; int dis[1000002]; int i,j,n,m,t; const int inf=0x7fffffff; int x[1000002],y[1000002],d[1000002]; void spfa() { int i,j; for(i=1;i<=n;i++) {dis[i]=inf;vis[i]=0;} vis[1]=1; dis[1]=0; queue<int>Q; Q.push(1); while(!Q.empty()) { int p=Q.front(); Q.pop(); vis[p]=0; for(i=0;i<s[p].size();i++) { if(dis[s[p][i].num]<=dis[p]+s[p][i].d) continue; dis[s[p][i].num]=dis[p]+s[p][i].d; if(!vis[s[p][i].num]) { Q.push(s[p][i].num); vis[s[p][i].num]=1; } } } return; } int main() { scanf("%d",&t); for(;t>0;t--) { scanf("%d%d",&n,&m); for(i=1;i<=n;i++) s[i].clear(); for(i=1;i<=m;i++) { scanf("%d%d%d",&x[i],&y[i],&d[i]); s[x[i]].push_back(node(y[i],d[i])); } int sum=0; spfa(); for(i=2;i<=n;i++) sum+=dis[i]; for(i=1;i<=n;i++)s[i].clear(); for(i=1;i<=m;i++) s[y[i]].push_back(node(x[i],d[i])); spfa(); for(i=2;i<=n;i++) sum+=dis[i]; printf("%d\n",sum); } return 0; }
hdu 1535 Invitation Cards(SPFA)
标签:
原文地址:http://www.cnblogs.com/stepping/p/5738499.html