//题意:求志愿者早上从总站分别到各站和晚上回到总站的最少总路费 #include<iostream> #include<algorithm> #include<vector> #include<queue> #include<algorithm> #include<numeric> #include<cstdio> using namespace std; const int MAX=1000010; int Len[MAX]; const int INF=1000000001; struct GNode { GNode(){} GNode(int num,int len):len(len),num(num){} int len,num; }; long long SPFA(const vector<vector<GNode> >& Graph,int source) { queue<int> Q; Q.push(source); fill(Len,Len+Graph.size(),INF); Len[source]=0; while(!Q.empty()) { int u=Q.front();Q.pop(); for(unsigned int i=0;i!=Graph[u].size();i++) if(Len[Graph[u][i].num]>Len[u]+Graph[u][i].len) { Len[Graph[u][i].num]=Len[u]+Graph[u][i].len; Q.push(Graph[u][i].num); } } long long sum=0; for(int i=0;i!=Graph.size();i++) sum+=Len[i]; return sum; } int main() { //freopen("in.txt","r",stdin); int n,v,e,a,b,l; scanf("%d",&n); while(n--) { scanf("%d%d",&v,&e); vector<vector<GNode> > Graph1(v),Graph2(v); for(int i=0;i!=e;i++) { scanf("%d%d%d",&a,&b,&l); Graph1[a-1].push_back(GNode(b-1,l)); Graph2[b-1].push_back(GNode(a-1,l)); } printf("%lld/n",SPFA(Graph1,0)+SPFA(Graph2,0)); } } 数据量很大,本来应该写一个邻接表的,但是懒得弄了,最后用vector花了7s多飘过。 这题数据有问题,说是和不大于10亿的,我用int来搞WA了无数次之后我终于相信和是超过整型范围的,改成long long之后就过了。