POJ 3114 强联通分量+最短路

点击打开链接

题意:给n个点,和一个有向图及边权,若两个点可以相互到达,则他们之间的费用可以为0,然后K个询问,问U到V的最小费用

思路:可以相互到达的费用为0,那么直接强联通缩点就行了,然后问最短路,因为询问K最多100,所以可以直接dijkstra一次一次的判断就行了

#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3fll;
const int maxn=510;
int V,m;
vectorG[maxn];
vectorrG[maxn];
vectorvs;
bool used[maxn];
int cmp[maxn];
void add_edge(int from,int to){
    G[from].push_back(to);
    rG[to].push_back(from);
}
void dfs(int v){
    used[v]=1;
    for(unsigned int i=0;i=0;i--){
        if(!used[vs[i]]) rdfs(vs[i],sum++);
    }
    return sum;
}
struct edge{
    int to,cost;
    edge(int a,int b){to=a;cost=b;}
};
typedef pairP;
vectorG1[maxn];
int dis[maxn];
void dijkstra(int s){
    priority_queue,greater

>que; fill(dis,dis+maxn,inf); dis[s]=0;que.push(P(0,s)); while(!que.empty()){ P p=que.top();que.pop(); int v=p.second; if(dis[v]dis[v]+e.cost){ dis[e.to]=dis[v]+e.cost; que.push(P(dis[e.to],e.to)); } } } } int A[300000],B[300000],C[300000]; int main(){ int a,b,q; while(scanf("%d%d",&V,&m)!=-1){ if(V==0&&m==0) break; for(int i=0;i


你可能感兴趣的:(图论,最短路,强联通分量)