国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Poj 3411 Paid Roads(最短路)

2019-11-06 06:04:52
字體:
來源:轉載
供稿:網友
題目地址:http://poj.org/PRoblem?id=3411

思路:記錄狀態,松弛操作時判斷即可。

#include<cstdio>#include<queue>#include<cstring>#include<iostream>#include<algorithm>#define debugusing namespace std;const int maxn=15;const int INF=0x3f3f3f3f;struct Edge{    int v,c,p,r;    Edge(int v=0,int c=0,int p=0,int r=0):v(v),c(c),p(p),r(r) {}};struct Node{    int u,s;    Node(int u=0,int s=0):u(u),s(s) {}};int n,m;queue<Node> q;vector<Edge> g[maxn];int v[maxn][1<<maxn];int dist[maxn][1<<maxn];void solve(int u,int s){    memset(v,0,sizeof(v));    while(!q.empty()) q.pop();    for(int i=1; i<=n; i++)        for(int j=0; j<(1<<n); j++)            dist[i][j]=INF;    v[u][s]=1,q.push(Node(u,s)),dist[u][s]=0;    while(!q.empty())    {        Node now=q.front();        q.pop(),v[now.u][now.s]=0;        for(int i=0; i<g[now.u].size(); i++)        {            Edge nt=g[now.u][i];            int tmp=now.s|(1<<(nt.v-1));            if(now.s&(1<<(nt.c-1)))            {                if(dist[nt.v][tmp]>dist[now.u][now.s]+nt.p)                {                    dist[nt.v][tmp]=dist[now.u][now.s]+nt.p;                    if(!v[nt.v][tmp])                    {                        v[nt.v][tmp]=1;                        q.push(Node(nt.v,tmp));                    }                }            }            else            {                if(dist[nt.v][tmp]>dist[now.u][now.s]+nt.r)                {                    dist[nt.v][tmp]=dist[now.u][now.s]+nt.r;                    if(!v[nt.v][tmp])                    {                        v[nt.v][tmp]=1;                        q.push(Node(nt.v,tmp));                    }                }            }        }    }    int ans=INF;    for(int i=(1<<(n-1)); i<(1<<n); i++)        ans=min(ans,dist[n][i]);    if(ans>=INF) printf("impossible/n");    else printf("%d/n",ans);}int main(){#ifdef debug    freopen("in.in","r",stdin);#endif // debug    scanf("%d%d",&n,&m);    for(int i=0; i<m; i++)    {        int a,b,c,p,r;        scanf("%d%d%d%d%d",&a,&b,&c,&p,&r);        g[a].push_back(Edge(b,c,p,r));    }    solve(1,1);    return 0;}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 南阳市| 卢氏县| 句容市| 新化县| 徐汇区| 汝阳县| 福海县| 济南市| 和龙市| 清镇市| 卢氏县| 屯昌县| 吉首市| 武定县| 明光市| 华宁县| 辽宁省| 陈巴尔虎旗| 鄄城县| 卓尼县| 城市| 天津市| 浦东新区| 滕州市| 如皋市| 民丰县| 宜宾县| 临邑县| 嘉禾县| 革吉县| 安阳县| 天津市| 江阴市| 巨野县| 襄城县| 陈巴尔虎旗| 杭锦旗| 曲松县| 灵丘县| 平昌县| 桦川县|