最短路四種基礎算法模板題

poj2387  dijsktra模板題

#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
#include <set>
#include <queue>
#define inf 0x3f3f3f3f
#define PI acos((double)-1)
using namespace std;

typedef long long ll;
const int maxn=2100;

int map[maxn][maxn],t,n,dist[maxn],vis[maxn];

void dijsktra()
{
    memset(vis,0,sizeof(vis));
    memset(dist,inf,sizeof(dist));
    dist[1]=0;
    for(int i=1;i<=n;i++)
    {
        int min=inf,k;
        for(int j=1;j<=n;j++)
        {
            if(dist[j]<min&&!vis[j])
            {
                k=j;
                min=dist[j];
            }
        }
        vis[k]=1;
        for(int j=1;j<=n;j++)
        {
            if(!vis[j]&&dist[j]>map[k][j]+min)
                dist[j]=map[k][j]+min;
        }
    }
    cout << dist[n] << endl;
}

int main()
{
    while(scanf("%d%d",&t,&n)!=EOF)
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(i==j)
                    map[i][j]=0;
                else
                    map[i][j]=map[j][i]=inf;
            }
        }
        for(int i=0;i<t;i++)
        {
            int a,b,w;
            scanf("%d%d%d",&a,&b,&w);
            if(w<map[a][b])
            {
                map[a][b]=map[b][a]=w;
            }
        }
        dijsktra();
    }
}


poj3660  floyd模板

#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;

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

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

int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        int cnt=0;
        memset(map,0,sizeof(map));
        for(int i=0;i<m;i++)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            map[a][b]=1;
        }
        floyd();
        for(int i=1;i<=n;i++)
        {
            int ans=n-1;
            for(int j=1;j<=n;j++)
                if(map[j][i]||map[i][j])
                    ans--;
            if(!ans)
                cnt++;
        }
        cout << cnt << endl;
    }
    return 0;
}


poj1860   判負權

bellman

#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <algorithm>
#include <stack>
#include <queue>
#include <cmath>
#include <list>
#include <vector>
#include <set>
#define inf 0x3f3f3f3f
#define PI acos(double(-1))
using namespace std;

typedef long long ll;
const int maxn=110;
struct node
{
    int u,v;
    double r,c;
};
node e[maxn*maxn*2];
int n,m,vis[maxn],s,cnt,head[maxn],next[maxn*maxn*2];
double dist[maxn],v;

int bellman()
{
    for(int i=1;i<=n;i++)
        dist[i]=0;
    dist[s]=v;
    int flag;
    for(int i=0;i<n-1;i++)
    {
        flag=0;
        for(int j=0;j<cnt;j++)
        {
            if(dist[e[j].v]<(dist[e[j].u]-e[j].c)*e[j].r)
            {
                dist[e[j].v]=(dist[e[j].u]-e[j].c)*e[j].r;
                flag=1;
            }
        }
        if(!flag)
            break;
    }
    for(int i=0;i<cnt;i++)
    {
        if(dist[e[i].v]<(dist[e[i].u]-e[i].c)*e[i].r)
            return 1;
    }
    return 0;
}

int main()
{
    while(scanf("%d%d%d%lf",&n,&m,&s,&v)!=EOF)
    {
        cnt=0;
        memset(head,-1,sizeof(head));
        for(int i=0;i<m;i++)
        {
            int a,b;
            double r1,c1,r2,c2;
            scanf("%d%d%lf%lf%lf%lf",&a,&b,&r1,&c1,&r2,&c2);
            e[cnt].u=a;
            e[cnt].v=b;
            e[cnt].r=r1;
            e[cnt].c=c1;
            next[cnt]=head[a];
            head[a]=cnt;
            cnt++;
            e[cnt].u=b;
            e[cnt].v=a;
            e[cnt].r=r2;
            e[cnt].c=c2;
            next[cnt]=head[a];
            head[a]=cnt;
            cnt++;
        }
        int j=bellman();
        if(j)
            cout << "YES" << endl;
        else
            cout << "NO" << endl;
    }
    return 0;
}


spfa

#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <algorithm>
#include <stack>
#include <queue>
#include <cmath>
#include <list>
#include <vector>
#include <set>
#define inf 0x3f3f3f3f
#define PI acos(double(-1))
using namespace std;

typedef long long ll;
const int maxn=3000;
struct node
{
    int u,v;
    double r,c;
};
node e[maxn];
int n,m,vis[maxn],s,cnt,head[maxn],next[maxn],num[maxn];
double dist[maxn],v;

int spfa()
{
    queue<int> q;
    for(int i=0;i<=n;i++)
        dist[i]=0;
    memset(vis,0,sizeof(vis));
    memset(num,0,sizeof(num));
    dist[s]=v;
    q.push(s);
    vis[s]=1;
    num[s]++;
    while(!q.empty())
    {
        int x=q.front();
        q.pop();
        vis[x]=0;
        for(int i=head[x];i!=-1;i=next[i])
        {
            if(dist[e[i].v]<(dist[x]-e[i].c)*e[i].r)
            {
                dist[e[i].v]=(dist[x]-e[i].c)*e[i].r;
                if(!vis[e[i].v])
                {
                    vis[e[i].v]=1;
                    q.push(e[i].v);
                    num[e[i].v]++;
                }
                if(num[e[i].v]>n)
                    return 1;
            }
        }
    }
    return 0;
}

int main()
{
    while(scanf("%d%d%d%lf",&n,&m,&s,&v)!=EOF)
    {
        cnt=0;
        memset(head,-1,sizeof(head));
        for(int i=0;i<m;i++)
        {
            int a,b;
            double r1,c1,r2,c2;
            scanf("%d%d%lf%lf%lf%lf",&a,&b,&r1,&c1,&r2,&c2);
            e[cnt].u=a;
            e[cnt].v=b;
            e[cnt].r=r1;
            e[cnt].c=c1;
            next[cnt]=head[a];
            head[a]=cnt;
            cnt++;
            e[cnt].u=b;
            e[cnt].v=a;
            e[cnt].r=r2;
            e[cnt].c=c2;
            next[cnt]=head[b];
            head[b]=cnt;
            cnt++;
        }
        int j=spfa();
        if(j)
            cout << "YES" << endl;
        else
            cout << "NO" << endl;
    }
    return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章