POJ1511-Invitation Cards
http://poj.org/problem?id=1511
模板题
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #define INF 1000000005 #define MAXN 1000005 using namespace std; int head[MAXN],dis[MAXN],vis[MAXN],in[MAXN],s[MAXN],t[MAXN],w[MAXN],n,m,tot; struct node { int v,w,next; }edge[MAXN]; queue<int> Q; void init() { int i; tot=0; memset(head,-1,sizeof(head)); } void add(int s,int t,int w) { edge[++tot].v=t; edge[tot].w=w; edge[tot].next=head[s]; head[s]=tot; } int spfa() { int i,j,k; memset(vis,0,sizeof(int)*(n+1)); memset(in,0,sizeof(int)*(n+1)); for(i=1;i<=n;i++) dis[i]=INF; Q.push(1); vis[1]=1; dis[1]=0; while(!Q.empty()) { i=Q.front(); Q.pop(); for(j=head[i];j!=-1;j=edge[j].next) { k=edge[j].v; if(dis[i]+edge[j].w<dis[k]) { dis[k]=dis[i]+edge[j].w; if(!vis[k]) { Q.push(k); in[k]++; if(in[k]>=n) return -1; vis[k]=1; } } } } } int main(void) { int T,i; long long ans=0; scanf("%d",&T); while(T--) { init(); scanf("%d%d",&n,&m); for(i=0;i<m;i++) { scanf("%d%d%d",&s[i],&t[i],&w[i]); add(s[i],t[i],w[i]); } spfa(); ans=0; for(i=1;i<=n;i++) ans+=dis[i]; init(); for(i=0;i<m;i++) add(t[i],s[i],w[i]); spfa(); for(i=1;i<=n;i++) ans+=dis[i]; printf("%I64d\n",ans); } return 0; }