diff --git a/POJ/1511_xuezhongfenfei.cpp b/POJ/1511_xuezhongfenfei.cpp new file mode 100644 index 0000000..2925ec3 --- /dev/null +++ b/POJ/1511_xuezhongfenfei.cpp @@ -0,0 +1,84 @@ +#include +#include +using namespace std; +typedef struct fun +{ + int a,w,pre; +}e; +fun link[2][1000005]; +bool vis[1000005]; +int point[2][1000005]; +__int64 price[1000005]; +int P,Q; +void spfa(int n) +{ + int i; + for(i=2; i<=P; i++) + { + vis[i]=false; + price[i]=INT_MAX; + } + vis[1]=true; + price[i]=0; + queueq; + q.push(1); + while(q.empty()==false) + { + int t=q.front(); + q.pop(); + vis[t]=false; + i=point[n][t]; + while(i!=-1) + { + + int v=link[n][i].a; + if(price[v]>price[t]+link[n][i].w) + { + price[v]=price[t]+link[n][i].w; + if(vis[v]==false) + { + vis[v]=true; + q.push(v); + } + } + i=link[n][i].pre; + } + } +} +int main() +{ + int T,i,a,b,c; + scanf("%d",&T); + while(T--) + { + scanf("%d%d",&P,&Q); + for(i=1; i<=P; i++) + point[0][i]=point[1][i]=-1;//这个是用来弄初值的 + i=0; + for(i=1; i<=Q; i++) + { + scanf("%d%d%d",&a,&b,&c); + link[0][i].a=a; + link[0][i].w=c; + link[1][i].a=b; + link[1][i].w=c; + link[1][i].pre=point[1][a];//记录的是以a开头的 + point[1][a]=i; + link[0][i].pre=point[0][b]; + point[0][b]=i; + } + __int64 sum=0; + spfa(1);//是用来出发点不同的啊 + for(i=1; i<=P; i++) + { + sum+=price[i]; + } + spfa(0); + for(i=1; i<=P; i++) + { + sum+=price[i]; + } + printf("%I64d\n",sum); + } + return 0; +}