kuangbin 最短路集合

Til the Cows Come Home poj-2387

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<set>
#include<map>
#include<vector>
using namespace std;
#define INF 0x3f3f3f3f
#define eps 1e-10
#define PI acos(-1.0)
#define _e exp(1.0)
#define ll long long
const int maxn=1e3+5;

int cost[maxn][maxn];
int d[maxn];
bool used[maxn];
int n;

void dijkstra(int s)
{
    fill(d,d+n,INF);
    fill(used,used+n,false);
    d[s]=0;
    while(true)
    {
        int v=-1;
        for(int u=1;u<=n;u++)
        {
            if(!used[u] && (v==-1 || d[u]<d[v]))
                v=u;
        }
        if(v==-1)
            break;
        used[v]=true;
        for(int u=1;u<=n;u++)
            d[u]=min(d[u],d[v]+cost[v][u]);
    }
}
int main()
{
    int T;
    scanf("%d%d",&T,&n);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            cost[i][j]=INF;
    for(int i=0;i<T;i++)
    {
        int u,v,len;
        scanf("%d%d%d",&u,&v,&len);
        {
            if(len<cost[u][v])
            {
              cost[u][v]=len;
              cost[v][u]=len;
            }
        }
    }
    dijkstra(n);
    cout<<d[1]<<endl;
}
View Code

Frogger poj-2253

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<set>
#include<vector>
using namespace std;
#define INF 0x3f3f3f3f
#define eps 1e-10
#define PI acos(-1.0)
#define _e exp(1.0)
#define ll long long
const int maxn=205;
int x[maxn],y[maxn],n;
double map[maxn][maxn];


void floyd()
{
    for(int k=1;k<=n;k++)
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                map[i][j]=min(map[i][j],max(map[i][k],map[k][j]));
}
int main()
{
    int ca=1;
    while(~scanf("%d",&n) && n)
    {
        memset(map,0,sizeof(map));
        for(int i=1;i<=n;i++)
        {
            scanf("%d %d",&x[i],&y[i]);
        }
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                map[i][j]=map[j][i]=sqrt(double(x[i]-x[j])*(x[i]-x[j])+double(y[i]-y[j])*(y[i]-y[j]));
        floyd();
        printf("Scenario #%d\nFrog Distance = %.3lf\n\n",ca++,map[1][2]);
        
    }
    return 0;
}
View Code

Heavy Transportation poj-1797

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<sstream>
#include<cmath>
#include<cstdlib>
#include<queue>
using namespace std;

#define ll long long
#define llu unsigned long long
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
const int maxn=1005;

int map[maxn][maxn];
int n,m;

int dijkstra()
{
    int vis[maxn],d[maxn];
    int v;
    for(int i=1;i<=n;i++)
    {
        vis[i]=0;
        d[i]=map[1][i];  //d[]是最大承载量
    }
    for(int i=1;i<=n;i++)
    {
        int f=-1;
        for(int j=1;j<=n;j++)
            if(!vis[j] && d[j]>f)
            {
                f=d[j];
                v=j;
            }
        vis[v]=1;
        for(int j=1;j<=n;j++)
        {
            if(!vis[j] && d[j]<min(d[v],map[v][j]))
                d[j]=min(d[v],map[v][j]);
        }
    }
    return d[n];
}
int main()
{
    int t;
    scanf("%d",&t);
    int ca=1;
    while(t--)
    {
        scanf("%d%d",&n,&m);
        for(int i=0;i<=n;i++)
            for(int j=0;j<=n;j++)
                map[i][j]=0;
        for(int i=0;i<m;i++)
        {
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
            map[a][b]=map[b][a]=c;
        }
        printf("Scenario #%d:\n",ca++);
        printf("%d\n\n",dijkstra());
    }
}
View Code

Silver Cow Party poj-3268

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<sstream>
#include<cmath>
#include<cstdlib>
#include<queue>
using namespace std;

#define ll long long
#define llu unsigned long long
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
const int maxn = 1e3 + 5;

int cost[maxn][maxn];
bool used[maxn];
int d[maxn];
int ans[maxn];
int n, m, x;

void dijkstra(int s)
{
    memset(d, INF, sizeof d);
    memset(used, false, sizeof used);
    d[s] = 0;
    while (true)
    {
        int v = -1;
        for (int u = 1; u <= n; u++)
            if (!used[u] && (v == -1 || d[u] < d[v]))
                v = u;
        if (v == -1)
            break;
        used[v] = true;
        for (int u = 1; u <= n; u++)
            d[u] = min(d[u], d[v] + cost[v][u]);
    }
}

int main()
{
    ios::sync_with_stdio(false);
    cin >> n >> m >> x;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            cost[i][j] = INF;
    for (int i = 0; i < m; i++)
    {
        int a, b, l;
        cin >> a >> b >> l;
        cost[a][b] = l;
    }
    dijkstra(x);
    for (int i = 1; i <= n; i++)
    {
        ans[i] = d[i];
    //    cout << d[i] << endl;
    }
        
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            if (i >= j)
                swap(cost[i][j], cost[j][i]);
    dijkstra(x);
    int maxx = 0;
    for (int i = 1; i <= n; i++)
        maxx = max(ans[i] + d[i],maxx);
    cout << maxx << endl;
}
View Code

Currency Exchange poj-1860

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;
#define ll long long

const int maxn=1e2+5;

int n,m,s;
double v;
double g1[maxn][maxn]={0},g2[maxn][maxn]={0};  //g1:a->b汇率  g2:a->b佣金
double map[maxn]={0};  //在某一兑换点的金钱的数额

int floyd()
{
    double d[maxn];
    for(int i=1;i<=n;i++)
        d[i]=map[i];
    for(int k=1;k<=n;k++) {
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                if ((map[i] - g2[i][j]) * g1[i][j] > map[j]) {
                    map[j] = (map[i] - g2[i][j]) * g1[i][j];
                }
            }
        }
    }
    for(int i=1;i<=n;i++)
        if(d[i]<map[i]) {
            return 1;
        }
        return 0;
}
int main()
{
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    cin>>n>>m>>s>>v;   //n:货币的总数,m:兑换点的数目,s:手上钱的类型 v:手上钱的数目
    for(int i=1;i<=m;i++)
    {
        int a,b;
        double c,d,e,f;
        cin>>a>>b>>c>>d>>e>>f;
        g1[a][b]=c;
        g2[a][b]=d;
        g1[b][a]=e;
        g2[b][a]=f;
    }
    map[s]=v;
    floyd();
    if(floyd())
        cout<<"YES"<<endl;
    else
        cout<<"NO"<<endl;
}
View Code

Wormholes poj-3259

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<sstream>
#include<cmath>
#include<cstdlib>
#include<queue>
using namespace std;

#define ll long long
#define llu unsigned long long
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
const int maxn = 1e5 + 5;

int map[505][505],n,m,k,num=0;

void Init()
{
    memset(map,INF,sizeof map);
}

int floyd()
{
    for(int k=1;k<=n;k++)
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                int t = map[i][k]+map[k][j];
                if(map[i][j] > t)
                    map[i][j]=t;
            }
            if(map[i][i]<0)
                return 1;
        }
    return 0;
}
int main()
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    
    int t;
    cin>>t;
    while(t--)
    {
        Init();
        cin>>n>>m>>k;
        for(int i=1;i<=n;i++)
            map[i][i]=0;
        for(int i=1;i<=m;i++)
        {
            int a,b,c;
            cin>>a>>b>>c;
            if(c<map[a][b])
                map[a][b]=map[b][a]=c;
        }
        for(int i=1;i<=k;i++)
        {
            int a,b,c;
            cin>>a>>b>>c;
            map[a][b]=-c;
        }
        if(floyd())
            puts("YES");
        else
            puts("NO");
    }
    
    
}
View Code

MPI Maelstrom poj-1502

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<sstream>
#include<cmath>
#include<cstdlib>
#include<queue>
using namespace std;

#define ll long long
#define llu unsigned long long
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
const int maxn = 1e5 + 5;
int dis[505];
bool vis[505];
int map[505][505],n,m,k,num=0;
void Init()
{
    memset(map,INF,sizeof map);
    for(int i=1;i<=n;i++)
        map[i][i]=0;
}
void Dijkstra(int start)
{
    for(int i=1;i<=n;i++)
    {
        dis[i]=INF;vis[i]=false;
    }
    dis[start]=0;
    for(int j=1;j<=n;j++)
    {
        int k=-1;
        int Min=INF;
        for(int i=1;i<=n;i++)
            if(!vis[i] && dis[i]<Min)
            {
                Min=dis[i];
                k=i;
            }
        if(k==-1)
            break;
        vis[k]=true;
        for(int i=1;i<=n;i++)
            if(!vis[i] && dis[k]+map[k][i]<dis[i])
            {
                dis[i]=dis[k]+map[k][i];
            }
    }
}
int main()
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
   
    cin>>n;
    Init();
    for(int i=2;i<=n;i++)
        for(int j=1;j<i;j++)
        {
            char str[10];
            cin>>str;
            if(str[0]!='x')
                map[i][j]=map[j][i]=atoi(str);
        }
    Dijkstra(1);
    int sum=0;
    for(int i=2;i<=n;i++)
        sum=max(sum,dis[i]);
    cout<<sum<<endl;

    
}
View Code

Extended Traffic Lightoj-1074

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
    
using namespace std;

const int MaxN=300;
const int MaxM=MaxN*MaxN;
const int INF=10e8;

struct Edge
{
    int to,next,cost;
};

Edge E[MaxM];
int head[MaxN],Ecou;
bool vis[MaxN];
int couNode[MaxN];
bool cir[MaxN];

void init(int N)
{
    Ecou=0;

    for(int i=1;i<=N;++i)
        head[i]=-1,vis[i]=0,cir[i]=0;
}

void addEdge(int u,int v,int c)
{
    E[Ecou].to=v;
    E[Ecou].cost=c;
    E[Ecou].next=head[u];
    head[u]=Ecou++;
}

void dfs(int u)
{
    cir[u]=1;

    for(int i=head[u];i!=-1;i=E[i].next)
        if(!cir[E[i].to])
            dfs(E[i].to);
}

bool SPFA(int lowcost[],int N,int start)
{
    queue <int> que;
    int u,v,c;

    for(int i=1;i<=N;++i)
        lowcost[i]=INF,couNode[i]=0;
    lowcost[start]=0;

    que.push(start);
    vis[start]=1;
    couNode[start]=1;

    while(!que.empty())
    {
        u=que.front();
        que.pop();

        vis[u]=0;            // !!!

        for(int i=head[u];i!=-1;i=E[i].next)
        {
            v=E[i].to;
            c=E[i].cost;

            if(cir[v])
                continue;

            if(lowcost[v]>lowcost[u]+c)
            {
                lowcost[v]=lowcost[u]+c;

                if(!vis[v])
                {
                    vis[v]=1;
                    que.push(v);

                    ++couNode[v];

                    if(couNode[v]>N)
                        dfs(v);
                }
            }
        }
    }

    return 1;
}

int ans[MaxN];
int val[MaxN];

inline int cube(int x)
{
    return x*x*x;
}

int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);

    int T;
    int N,Q,M;
    int a,b;
    int cas=1;

    scanf("%d",&T);

    while(T--)
    {
        scanf("%d",&N);
        init(N);

        for(int i=1;i<=N;++i)
            scanf("%d",&val[i]);

        scanf("%d",&M);
        while(M--)
        {
            scanf("%d %d",&a,&b);
            addEdge(a,b,cube(val[b]-val[a]));
        }

        SPFA(ans,N,1);

        scanf("%d",&Q);

        printf("Case %d:\n",cas++);

        while(Q--)
        {
            scanf("%d",&a);

            if(cir[a] || ans[a]<3 || ans[a]==INF)
                printf("?\n");
            else
                printf("%d\n",ans[a]);
        }
    }
    
    return 0;
}
View Code

Cow Contest poj-3660

分析:floyd闭包,看每一头牛是否确定了赢的和输的加起来是n-1,是的话名次就确定了。(vj上g++rt了,c++就ac了)

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include<map>
#include<cmath>

using namespace std;
#define ll long long

const int maxn=1e6+5;
const int INF = 0x3f3f3f3f;

int n,m;
int vis[105][105];

void Init()
{
    memset(vis,0,sizeof vis);
}

void floyd()
{
    for(int k=1;k<=n;k++)
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
            {
                if(vis[i][k]==1 && vis[k][j]==1)
                    vis[i][j]=1;
            }
}
int main()
{
    ios::sync_with_stdio(false);
    while(~scanf("%d%d",&n,&m))
    {
        Init();
        for(int i=1;i<=m;i++)
        {
            int a,b;
            cin>>a>>b;
            vis[a][b]=1;
        }
        floyd();
        int ans=0;
        for(int i=1;i<=n;i++)
        {
            int du=0;
            for(int j=1;j<=n;j++)
            {
                if(vis[i][j]==1 || vis[j][i]==1)
                    du++;
            }
            if(du==n-1)
                ans++;

        }
        cout<<ans<<endl;
    }
}
View Code

Arbitrage poj-2240

分析:map存储字符串对应的编号

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<sstream>
#include<cmath>
#include<cstdlib>
#include<map>
#include<queue>
using namespace std;

#define ll long long
#define llu unsigned long long
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
const int maxn = 1e5 + 5;
int n;
double mp[60][60];
map<string,int>p;
void floyd()
{
    for(int k=1;k<=n;k++)
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                if(mp[i][j]<mp[i][k]*mp[k][j])
                    mp[i][j]=mp[i][k]*mp[k][j];
    return;
}
int main()
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int ca=1;
    while(~scanf("%d%*c",&n) && n)
    {
        p.clear();
        for(int i=1;i<=n;i++)
        {
            char str[100];
            scanf("%s",str);
            p[str]=i;
            mp[i][i]=1;
        }
        int m;
        scanf("%d%*c",&m);
        for(int i=1;i<=m;i++)
        {
            double a;
            char str1[100],str2[100];
            scanf("%s%lf%s",str1,&a,str2);
            mp[p[str1]][p[str2]]=a;
        }
        floyd();
        bool flag=false;
        for(int i=1;i<=n;i++)
        {
            if(mp[i][i]>1)
            {
                flag=true;
                break;
            }
        }
        if(flag)
            printf("Case %d: Yes\n",ca++);
        else
            printf("Case %d: No\n",ca++);
        
    }
}
View Code

Invitation Cards poj-1511

分析:邻接表存储路径,正反向spfa,用vector寸可能会超时

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include<map>
#include <queue>
#include<vector>
#include<cmath>

using namespace std;
#define ll long long
const int INF = 0x3f3f3f3f;
const int MAXN = 1e6+5;

struct  edge
{
    int to,w,nxt;
};
edge e[MAXN];
int n,cnt,head[MAXN],a1[MAXN],a2[MAXN],c[MAXN];
ll dis[MAXN];

void addedge(int u,int v,int w)
{
    e[cnt].to=v;
    e[cnt].w=w;
    e[cnt].nxt=head[u];
    head[u]=cnt++;
}

ll spfa()
{
    fill(dis,dis+MAXN,INF);
    queue<int>que;
    que.push(1);
    dis[1]=0;
    while(!que.empty())
    {
        int u=que.front();
        que.pop();
        for(int i=head[u];i!=-1;i=e[i].nxt){
            if(dis[e[i].to]>dis[u]+e[i].w){
                dis[e[i].to]=dis[u]+e[i].w;
                que.push(e[i].to);
            }
        }
    }
    ll res=0;
    for(int i=1;i<=n;i++)
        res+=dis[i];
    return res;

}
int main()
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int m;
        scanf("%d%d",&n,&m);
        cnt=0;
        fill(head,head+MAXN,-1);
        for(int i=0;i<m;i++)
        {
            scanf("%d%d%d",&a1[i],&a2[i],&c[i]);
            addedge(a1[i],a2[i],c[i]);
        }
        ll ans=spfa();
        cnt=0;
        fill(head,head+MAXN,-1);
        for(int i=0;i<m;i++){
            addedge(a2[i],a1[i],c[i]);
        }
        ans+=spfa();
        printf("%lld\n",ans);
    }

}
View Code

Candies poj-3159

分析:还是用邻接表存的路径,spfa用queue会超时,用vector也会超时,用栈的思想可以过,Dijkstra+优先队列也超时。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include<map>
#include <queue>
#include<vector>
#include<cmath>

using namespace std;
#define ll long long
const int INF = 0x3f3f3f3f;
const int MAXN = 1e6+5;

struct  edge
{
    int to,w,nxt;
};
edge e[MAXN];
int n,cnt,head[MAXN];
bool vis[MAXN];
ll dis[MAXN];

void addedge(int u,int v,int w)
{
    e[cnt].to=v;
    e[cnt].w=w;
    e[cnt].nxt=head[u];
    head[u]=cnt++;
}

ll spfa()
{
    fill(dis,dis+MAXN,INF);
    int sta[MAXN];
    memset(vis,false,sizeof vis);
    queue<int>que;
    que.push(1);
    dis[1]=0;
    int top=0;
    sta[++top]=1;
    vis[1]=true;
    while(top)
    {
        int u=sta[top--];
        vis[u]=false;
        for(int i=head[u];i!=-1;i=e[i].nxt)
        {
            int v = e[i].to;
            int w = e[i].w;
            if(dis[v] > dis[u] + w)
            {
                dis[v] = dis[u] + w;
                if(!vis[v])
                {
                    vis[v]=true;
                    sta[++top]= v;
                }
            }
        }
    }
}
int main()
{

        int m;
        scanf("%d%d",&n,&m);
        cnt=0;
        fill(head,head+MAXN,-1);
        for(int i=0;i<m;i++)
        {
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
            addedge(a,b,c);
        }

        spfa();

        printf("%lld\n",dis[n]);

}
View Code

Subway poj-2502

分析:关键在于寸图

#include <stdio.h>
#include <math.h>
#define maxn 203
#define INF 1e8
#define min(a,b) (a<b?a:b)
#define distance(t,s) sqrt((t.x-s.x)*(t.x-s.x)+(t.y-s.y)*(t.y-s.y))

typedef struct{
    int x,y;
}Point;

Point point[maxn],a;
int n;
double map[maxn][maxn];

int ex(Point t){
    int i;
    for(i=1;i<n;i++){
        if(t.x==point[i].x && t.y==point[i].y) break;
    }
    if(i==n) point[n++]=t;
    return i;
}

void dijkstra(){
    int i,j,v,vis[maxn];
    double min,d[maxn];
    for(i=1;i<n;i++){
        vis[i]=0;
        d[i]=map[1][i];
    }
    for(i=1;i<n;i++){
        min=INF;
        for(j=1;j<n;j++)
            if(!vis[j] && d[j]<min){
                min=d[j];
                v=j;
            }
        vis[v]=1;
        for(j=1;j<n;j++)
            if(!vis[j] && d[j]>map[v][j]+d[v])
                d[j]=map[v][j]+d[v];
    }
    printf("%d\n",(int)(d[2]+0.5));
}


void floyd(){
    int i,j,k;
    for(k=1;k<n;k++)
        for(i=1;i<n;i++)
            for(j=1;j<n;j++)
                if(map[i][j]>map[i][k]+map[k][j])
                    map[i][j]=map[i][k]+map[k][j];
}


int main(){
    int subway[maxn],scnt;
    int i,j,t;
    for(i=1;i<maxn;i++)
        for(j=1;j<maxn;j++)
            if(i==j) map[i][j]=0;
            else map[i][j]=INF;
    n=1;
    scanf("%d%d%d%d",&point[n].x,&point[n].y,&point[n+1].x,&point[n+1].y);
    n+=2;
    while(~scanf("%d%d",&a.x,&a.y)){
        t=n;
        scnt=0;
        subway[scnt++]=ex(a);    //要判断输入的点是否已经存在
        while(scanf("%d%d",&a.x,&a.y) && (a.x!=-1 && a.y!=-1)){
            subway[scnt++]=ex(a);
        }
        for(i=1;i<scnt;i++)        //地铁的站的时间只能是相邻的站点能到,不能从站点1直接到站点n
            map[subway[i]][subway[i-1]]=map[subway[i-1]][subway[i]]=distance(point[subway[i]],point[subway[i-1]])*3.0/2000.0;
    }
    for(i=1;i<n;i++)
        for(j=1;j<=i;j++)
            map[i][j]=map[j][i]=min(map[i][j],distance(point[i],point[j])*3.0/500.0);
    dijkstra();//flpyd()
    return 0;
}
View Code

昂贵的聘礼 poj-1062

分析:在于存图和建立一个新的源点

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<sstream>
#include<cmath>
#include<cstdlib>
#include <vector>
#include<queue>
using namespace std;

#define ll long long
#define llu unsigned long long
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
const int maxn =  3e5+5;
const ll mod = 1e9+7;
int n,m;
int map[105][105];
int dis[105];
int money[105];
int level[105];
int minLevel;
int vis[105];

void init()
{
    for(int i=0;i<=n;i++)
        for(int j=0;j<=n;j++)
            map[i][j]=(i==j?0:INF);
}

void Dijkstra()
{
    for(int i=0;i<n;i++)
    {
        int minn=INF;
        int u=-1;
        for(int j=1;j<=n;j++) {
            if (level[j] < minLevel || level[j] - minLevel > m)
                continue;
            if (dis[j] < minn && !vis[j]) {
                minn = dis[j];
                u = j;
            }
        }
            if(u==-1)
                break;
            vis[u]=1;
            for(int j=1;j<=n;j++)
            {
                if(level[j] < minLevel || (level[j]-minLevel > m))
                    continue;
                if(!vis[j] && dis[j]>dis[u]+map[u][j])
                    dis[j] = dis[u]+map[u][j];
            }

        
    }
}
int main()
{

    cin>>m>>n;
    init();
    for(int i=1;i<=n;i++)
    {
        int a;
        cin>>money[i]>>level[i]>>a;
        for(int j=0;j<a;j++)
        {
            int b,c;
            cin>>b>>c;
            map[b][i]=c;
        }
        map[0][i]=money[i];
    }
    int ans=INF;
    for(int i=1;i<=n;i++)
    {
        minLevel=level[i];
        for(int j=1;j<=n;j++)
            dis[j]=map[0][j];
        dis[0]=0;
        memset(vis,0,sizeof vis);
        vis[0]=1;
        Dijkstra();
        if(ans>dis[1])
            ans=dis[1];
    }
    cout<<ans<<endl;
}








/*
1 4
10000 3 2
2 8000
3 5000
1000 2 1
4 200
3000 2 1
4 200
50 2 0
 */
View Code

Tram poj-1847

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<sstream>
#include<cmath>
#include<stack>
#include<cstdlib>
#include <vector>
#include<queue>
using namespace std;

#define ll long long
#define llu unsigned long long
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
const int maxn =  1e5;
const ll mod = 1e9+7;

struct  node
{
    int u,v,len,next;
}e[maxn];
int dis[maxn],head[maxn];
bool vis[maxn];

void addedge(int u,int v,int len,int k)
{
    e[k].u = u;
    e[k].v = v;
    e[k].len = len;
    e[k].next = head[u];
    head[u] = k;
}

void spfa(int s)
{
    stack<int> sta;
    sta.push(s);
    while(sta.size())
    {
        int i=sta.top();
        sta.pop();
        vis[i] = false;
        for(int j=head[i];j!=0;j=e[j].next)
        {
            int u=e[j].u,v=e[j].v,len=e[j].len;
            if(dis[u]+len < dis[v])
            {
                dis[v] = dis[u]+len;
                if(vis[v] == false)
                {
                    vis[v]=true;
                    sta.push(v);
                }
            }
        }
    }
}
int main()
{
    int N,A,B,k = 1;
    cin>>N>>A>>B;
    memset(head,0,sizeof head);
    for(int i=1;i<=N;i++)
    {
        int M,v;
        dis[i] = INF;
        cin>>M>>v;
        addedge(i,v,0,k++);
        for(int j=1;j<M;j++)
        {
            cin>>v;
            addedge(i,v,1,k++);
        }
    }
    dis[A] = 0;
    spfa(A);
    if(dis[B] == INF)
        cout<<-1<<endl;
    else
        cout<<dis[B]<<endl;


}


/*
3 2 1
2 2 3
2 3 1
2 1 2
 */
View Code
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值