您的位置:首页 > 其它

POJ 3114 Countries in War

2018-02-22 19:13 176 查看
饭后小练习
点击打开链接

Tarjan缩点 + SPFA或Dijikstra堆优化就好了#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#include<stack>
#include<vector>

const int N=5000+5;

using namespace std;

struct node{
int dis,en;
};

vector<node> olg
,reg
;
stack<int> s;
queue<int> q;

int dfn
,low
,belong
,c
;
int n,u,v,w,cn,num,tmp1,tmp2,tmp3,E,O,D,K,inf=1e8;
bool ins
,vis
;

inline void read( int&x ) {
int f=1;x=0;char c=getchar();
while(c>'9'||c<'0') {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') x=10*x+c-48,c=getchar();
x=x*f;
}
void init(){
for(int i=1;i<=n;i++){
olg[i].clear();
reg[i].clear();
dfn[i]=low[i]=belong[i]=0;
ins[i]=false;
}
}
void tarjan(int x){
int j;
dfn[x]=low[x]=++cn;
s.push(x);ins[x]=true;
for(int i=0;i<olg[x].size();i++){
j=olg[x][i].en;
if(!dfn[j]){
tarjan(j);
low[x]=min(low[x],low[j]);
}
else if(ins[j]) low[x]=min(low[x],dfn[j]);
}
if(dfn[x]==low[x]){
++num;
while(s.top()!=x){
belong[s.top()]=num;
ins[s.top()]=false;
s.pop();
}
belong[x]=num;
ins[x]=false;
s.pop();
}
}
bool spfa(){
int j;
memset(vis,false,sizeof(vis));
for(int i=1;i<=num;i++)
c[i]=inf;
while(!q.empty()) q.pop();
c[belong[ O ]]=0;
q.push(belong[ O ]);
vis[belong[ O ]]=true;
while(!q.empty()){
tmp3=q.front();
for(int i=0;i<reg[tmp3].size();i++){
node tmpnode=reg[tmp3][i];
if(tmpnode.dis+c[tmp3]<c[tmpnode.en]){
c[tmpnode.en]=tmpnode.dis+c[tmp3];
if(!vis[tmpnode.en]){
q.push(tmpnode.en);
vis[tmpnode.en]=true;
}
}
}
vis[tmp3]=false;
q.pop();
}
return c[belong[ D ]]<inf;
}
void query(){
if(spfa())
printf("%d\n",c[belong[ D ]]);
else
printf("Nao e possivel entregar a carta\n");
}

int main(){
while(1){
read(n);read(E);
if(n==0 && E==0)
return 0;
for(int i=1;i<=E;i++){
read(u);read(v);read(w);
olg[u].push_back((node){w,v});
}
for(int i=1;i<=n;i++)
if(!dfn[i])
tarjan(i);
for(int i=1;i<=n;i++){
tmp1=belong[i];
for(int j=0;j<olg[i].size();j++){
tmp2=belong[olg[i][j].en];
if(tmp1!=tmp2)
reg[tmp1].push_back((node){olg[i][j].dis,tmp2});
}
}
cin >> K ;
for(int i=1;i<=K;i++){
read( O );read( D );
if(belong[O]==belong[D])
printf("0\n");
else
query();
}
cout<<endl;
init();
}
}POJ居然不能用#include<bits/stdc++.h>这个库
害得我不能一次性AC……伐开心
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Tarjan 强连通分量 POJ