[ZJ][spfa、尤拉路、bitmask] a416. 6. 城市松@Morris' Blog|PChome Online 人新台
2012-09-15 20:59:42| 人1,555| 回0 | 上一篇 | 下一篇

[ZJ][spfa、尤拉路、bitmask] a416. 6. 城市松

0 收藏 0 0 站台

容 :

        H城市松比。比域有 N站,2N1000。方明,我N站名以正整1,2,…,N表示。 N站有街道接,使得手可任一站出,由街道抵另一站。我可以用形表示些站跟街道之的:表示站,而接的代表接站之的街道(如一所示,其中站名以圈的字表示,而街道上的字代表跑完此街道所需花的)。我以符(I,J)表示接站I和站J的街道()。每一街道 (I,J)合一整的重值c(I,J)代表跑完(I,J)街道所要花的,其中c(I,J)需足 1c(I,J)999 Nodd 代表那些奇街道相接的站,H城市有一重要特性:Nodd 偶且 0 Nodd 20
   

给定一起站S和站T (ST),一程式算手起始站S出,把每街道跑至少一次且到站 T所需花的最短。注意:城市中所有的街道是向道,同一站和街道可被重。

                                       一
在一的子中,Nodd =0S=1T=6。二明其中一跑法:S=13

212435245646=T,可在 15位起出,所有街道跑至少一次,且到。然而此跑法所需的非最短。事上,此中花最短的跑法如三所示, 12313425

354656,所花 14位。
                                                                             二

入明 :

    第一有四字,字之以空白符做隔。第一字 N (2≤N≤1000)代表形的;第二字 M (1≤M≤N(N-1)/2) 代表形的;第三字代表起名;第四字代表名。第二起有 M,表示 M,每有三字,字之以空白符做隔:前二字代表的端,第三字代表的重值。入保任站之有相,Nodd偶且 0 ≤Nodd≤20

出明 :

出一整,代表手所花的最短。

例入 :help

入1: 6 10 1 6 1 2 1 1 3 1 2 3 1 2 4 2 2 5 1 3 4 1 3 5 1 4 5 1 4 6 1 5 6 1 入2: 3 3 1 2 1 2 4 1 3 6 2 3 5

例出 :

出1: 14 出2: 19

提示 :

出 :

100 年全科能力 - 6 (管理:stanley17112000)

就跟之前的洗街差不多, 的形自於有指定的起, 那也不仿想一下,
只是多了一路 0 的st<->ed, 但不要把路加入中, 接著找出 Nodd 出即可,
匹配, 拉出的就可以使成一尤拉道


#include <stdio.h>
#include <algorithm>
#include <vector>
#include <queue>
#define oo 0xfffffff
using namespace std;
typedef struct {
    int to, v;
} Arc;
vector<Arc> g[1001];
int n, m, st, ed;
int Nodd[22] = {}, gp[22][22], M;
void spfa(int st, int nd) {
    queue<int> Q;
    static int used[1001], dist[1001];
    static int i, tn;
    for(i = 1; i <= n; ++)
        used[i] = 0, dist[i] = 0xffff;
    Q.push(st);
    dist[st] = 0;
    while(!Q.empty()) {
        tn = Q.front();
        used[tn] = 0;
        Q.pop();
        for(vector<Arc>::iterator it = g[tn].begin();
            it != g[tn].end(); it++) {
            if(dist[it->to] > dist[tn]+it->v) {
                dist[it->to] = dist[tn]+it->v;
                if(!used[it->to]) {
                    used[it->to] = 1;
                    Q.push(it->to);
                }
            }
        }
    }
    for(i = 0; i < M; i++)
        gp[nd][i] = dist[Nodd[i]];
}
int dp[1<<22];
void dp_build(int n, int m) {
    if(n == 0 || dp[n] != oo)  return ;
    if(dp[m] == oo)
        dp_build(m, 0);
    int i, j, tmp;
    for(i = 0; i < M; i++) {
        if(n&(1<<i)) {
            for(j = i+1; j < M; j++) {
                if(n&(1<<j)) {
                    dp_build(n-(1<<i)-(1<<j), m+(1<<i)+(1<<j));
                    dp[n] = min(dp[n], dp[n-(1<<i)-(1<<j)]+gp[i][j]);
                }
            }
            break;
        }
    }
}
int main() {
    int i, j;
    while(scanf("%d %d %d %d", &n, &m, &st, &ed) == 4) {
        for(i = 1; i <= n; i++)
            g[i].clear();
        Arc in;
        int x, y;
        int indeg[1001] = {}, ans = 0;
        while(m--) {
            scanf("%d %d %d", &x, &y, &in.v);
            ans += in.v;
            in.to = y;
            g[x].push_back(in);
            in.to = x;
            g[y].push_back(in);
            indeg[x]++, indeg[y]++;
        }
        indeg[st]++, indeg[ed]++;
        M = 0;
        for(i = 1; i <= n; i++) {
            if(indeg[i]&1) {
                Nodd[M++] = i;
            }
        }
        for(i = 0; i < M; i++)
            spfa(Nodd[i], i);
        for(i = (1<<M)-1; i >= 0; i--)
            dp[i] = oo;
        dp[0] = 0;
        dp_build((1<<M)-1, 0);
        printf("%d\n", dp[(1<<M)-1]+ans);
    }
    return 0;
}

台: Morris
人(1,555) | 回(0)| 推 (0)| 收藏 (0)|
全站分: 不分 | 人分: |
此分下一篇:[ZJ][多重背包+Greedy] a350. 3. 的
此分上一篇:[TopCoder][SRM553] Suminator

是 (若未登入"人新台"看不到回覆唷!)
* 入:
入片中算式的果(可能0) 
(有*必填)
TOP
全文
ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86