poj 3114 Countries in War

http://poj.org/problem?id=3114

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <queue>
  4 #include <algorithm>
  5 #define maxn 300000
  6 using namespace std;
  7 
  8 const int inf=1<<30;
  9 int head[maxn],head1[maxn],dfn[maxn],low[maxn],belong[maxn],stack1[maxn],dis[maxn],cnt[maxn];
 10 int e,ee,bcc_clock,bcnt,top,N,E,x,y,h,k,o,d;
 11 bool vis[maxn],visi[maxn];
 12 
 13 struct node
 14 {
 15     int u,v,w,next;
 16 }p[maxn];
 17 
 18 struct node1
 19 {
 20     int u,v,w,next;
 21 }pp[maxn];
 22 
 23 void add(int u,int v,int w)
 24 {
 25     p[e].u=u;
 26     p[e].v=v;
 27     p[e].w=w;
 28     p[e].next=head[u];
 29     head[u]=e++;
 30 }
 31 
 32 void addnode(int u,int v,int w)
 33 {
 34     pp[ee].u=u;pp[ee].v=v;
 35     pp[ee].w=w;
 36     pp[ee].next=head1[u];
 37     head1[u]=ee++;
 38 }
 39 
 40 void tarjan(int u)
 41 {
 42     vis[u]=true;
 43     dfn[u]=low[u]=++bcc_clock;
 44     stack1[++top]=u;
 45     for(int i=head[u]; i!=-1; i=p[i].next)
 46     {
 47         int v=p[i].v;
 48         if(!dfn[v])
 49         {
 50             tarjan(v);
 51             low[u]=min(low[u],low[v]);
 52         }
 53         else if(vis[v])
 54         {
 55             low[u]=min(low[u],dfn[v]);
 56         }
 57     }
 58     if(dfn[u]==low[u])
 59     {
 60         bcnt++;
 61         int j;
 62         do
 63         {
 64             j=stack1[top--];
 65             vis[j]=false;
 66             belong[j]=bcnt;
 67         }while(j!=u);
 68     }
 69 }
 70 
 71 void deal()
 72 {
 73    bcc_clock=0,bcnt=0,top=0;
 74    memset(vis,false,sizeof(vis));
 75    memset(belong,0,sizeof(belong));
 76    memset(dfn,0,sizeof(dfn));
 77    for(int i=1; i<=N; i++)
 78    {
 79        if(!dfn[i])
 80        {
 81            tarjan(i);
 82        }
 83    }
 84 }
 85 
 86 void inti()
 87 {
 88     memset(head,-1,sizeof(head));
 89     memset(head1,-1,sizeof(head1));
 90     e=0,ee=0;
 91 }
 92 bool ralex(int u,int v,int w)
 93 {
 94     if(dis[v]>dis[u]+w)
 95     {
 96         dis[v]=dis[u]+w;
 97         return true;
 98     }
 99     return false;
100 }
101 
102 bool spfa(int src)
103 {
104     memset(visi,false,sizeof(visi));
105     memset(cnt,0,sizeof(cnt));
106     queue<int>q;
107     for(int i=0; i<=N; i++)
108     {
109         dis[i]=inf;
110     }
111     dis[src]=0;
112     visi[src]=true;
113     q.push(src);
114     while(!q.empty())
115     {
116         int u=q.front();q.pop();
117         visi[u]=false;
118         for(int i=head1[u]; i!=-1; i=pp[i].next)
119         {
120             if(ralex(u,pp[i].v,pp[i].w)&&!visi[pp[i].v])
121             {
122                 if((++cnt[pp[i].v])>N) return false;
123                 visi[pp[i].v]=true;
124                 q.push(pp[i].v);
125             }
126         }
127     }
128     return true;
129 }
130 
131 int main()
132 {
133     while(scanf("%d%d",&N,&E)!=EOF)
134     {
135         inti();
136         if(N==0&&E==0) break;
137         for(int i=0; i<E; i++)
138         {
139             scanf("%d%d%d",&x,&y,&h);
140             add(x,y,h);
141         }
142         deal();
143         for(int i=1; i<=N; i++)
144         {
145             for(int j=head[i]; j!=-1; j=p[j].next)
146             {
147                 int v=p[j].v;
148                 if(belong[i]==belong[v]) addnode(i,v,0);
149                 else if(belong[i]!=belong[v]) addnode(i,v,p[j].w);
150             }
151         }
152         scanf("%d",&k);
153         for(int i=0; i<k; i++)
154         {
155             scanf("%d%d",&o,&d);
156             spfa(o);
157             if(dis[d]!=inf)
158                 printf("%d\n",dis[d]);
159             else
160                 printf("Nao e possivel entregar a carta\n");
161         }
162         printf("\n");
163     }
164     return 0;
165 }
View Code

 

posted @ 2014-02-18 08:22  null1019  阅读(156)  评论(0编辑  收藏  举报