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;
}
posted @ 2012-08-30 19:58  Yogurt Shen  阅读(133)  评论(0编辑  收藏  举报