poj3411

#include <iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
const int INF=100000000;
int n,m,d[1500][20];
struct edge
{
    int to,p,r,c;
};
struct state
{
    int cost,s,v;
    state(int cost,int s,int v):cost(cost),s(s),v(v)
    {}
    bool operator >(const state &s)const
    {
        return cost >s.cost;
    }
};
vector<edge> g[20];
int main()
{
    scanf("%d%d",&n,&m);
    edge e;
    int a,t;
    for(int i=0;i<m;i++)
    {
        scanf("%d%d%d%d%d",&a,&e.to,&e.c,&e.p,&e.r);
        g[a].push_back(e);

    }
    priority_queue<state,vector<state>,greater<state> > que;
    for(int i=0;i<1500;i++)
    fill(d[i],d[i]+20,INF);
    d[1][1]=0;
    que.push(state(0,1,1));
    while(!que.empty())
    {
        state p=que.top();
        que.pop();
        int v=p.v;
        if(d[p.s][v]<p.cost)
            continue;
        for(int i=0;i<g[v].size();i++)
        {
            edge &e=g[v][i];
            int cost;
            if((1<<(e.c-1))&p.s)
                cost=min(e.r,e.p);
            else
                cost=e.r;
            if(d[p.s|(1<<(e.to-1))][e.to]>d[p.s][v]+cost)
            {
                d[p.s|(1<<(e.to-1))][e.to]=d[p.s][v]+cost;
            que.push((state){d[p.s|(1<<(e.to-1))][e.to],p.s|(1<<(e.to-1)),e.to});
            }
        }
    }
    int ans =INF;
    for(int i=1;i<1<<n;i++)
        ans=min(ans,d[i][n]);
        if(ans==INF)
            printf("impossible\n");
        else
    printf("%d\n",ans);
    return 0;
}

本題我使用的是dijistra,WA了兩次

一次因爲沒有判斷是否可能的情況

還有一次害我好了好幾小時,最後在發現道路是單向的,瞬間感覺到出題者滿滿的惡意

代碼有點囉嗦,我也懶得改了

發佈了80 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章