zoukankan      html  css  js  c++  java
  • 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
    Frog Distance = %.3lf
    
    ",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:
    ",ca++);
            printf("%d
    
    ",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:
    ",cas++);
    
            while(Q--)
            {
                scanf("%d",&a);
    
                if(cir[a] || ans[a]<3 || ans[a]==INF)
                    printf("?
    ");
                else
                    printf("%d
    ",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
    ",ca++);
            else
                printf("Case %d: No
    ",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
    ",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
    ",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
    ",(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
  • 相关阅读:
    Attributes.Add用途与用法
    Reapter控件中更换Td背景色
    SQL SERVER查询时间条件式写法
    C# Cache何时使用及使用方法
    C#中Cache用法
    用sql语句将两个时间相减,得到时间距的DateDiff()函数
    HTML5 带进度条的异步文件上传原理
    Node环境Grunt开发流
    HTML5的Web SQL Databases(html5 本地数据库)API
    移动端范围拖动选择效果
  • 原文地址:https://www.cnblogs.com/smallhester/p/10105764.html
Copyright © 2011-2022 走看看