• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Why so serious? --[NKU]schindlerlee

            2009年12月4日星期五.sgu103 pku1158

            2009年12月4日星期五.sgu103==pku1158

            sgu103:dijkstra
            最好自己琢磨以下怎么做

            動態dijkstra
            trick:
            注意兩個頂點之間雖然有可能有路,但是由于信號燈的周期有可能永遠也不通

            sgu上不僅要數出最短路的值還要求輸出這條路徑。
              1 
              2 const int N = 320;
              3 const int inf = 1 << 30;
              4 int g[N][N];
              5 struct color{
              6     int t,c;
              7     color(){}
              8 };
              9 const int BLUE = 1;
             10 const int PURPLE = 0;
             11 struct node {
             12     bool isblue;
             13     int tb,tp,rt;
             14     node() {}
             15     color getColor(int time);
             16 }jun[N];
             17 
             18 color node::getColor(int time)
             19 {
             20     color ret;
             21     if(time < rt) {
             22         ret.c = isblue;
             23         ret.t = rt - time;
             24     }else {
             25         int cycle = tb + tp;
             26         time = (time - rt) % cycle;
             27         if(isblue) {
             28             if(time < tp) {
             29                 ret.c = PURPLE;
             30                 ret.t = tp - time;
             31             }else {
             32                 ret.c = BLUE;
             33                 ret.t = cycle - time;
             34             }
             35         }else {
             36             if(time < tb) {
             37                 ret.c = BLUE;
             38                 ret.t = tb - time;
             39             }else {
             40                 ret.c = PURPLE;
             41                 ret.t = cycle - time;
             42             }
             43         }
             44     }
             45     return ret;
             46 }
             47 
             48 int src,dest,m,n,dis[N],pre[N],out[N],top;
             49 bool vis[N];
             50 
             51 int time2go(int i,int j,int now,int cnt)
             52 {
             53     if(cnt > 3) { return inf;}
             54     color c1 = jun[i].getColor(now);
             55     color c2 = jun[j].getColor(now);
             56     if(c1.c == c2.c) {
             57         return now;
             58     }
             59     if(c1.t == c2.t) {
             60         return time2go(i,j,now + c1.t,cnt+1);
             61     }
             62     return now + min(c1.t,c2.t);
             63 }
             64 
             65 bool dijkstra()
             66 {
             67     int i,j,k;
             68     memset(vis,0,sizeof(vis));
             69     memset(pre,0,sizeof(pre));
             70     for(i = 1;i <= n;i++) {
             71         dis[i] = inf;
             72     }
             73     dis[src] = 0;
             74     for(k = 1;k <= n;k++) {
             75         int idx = 0,val = inf;
             76         for(i = 1;i <= n;i++) {
             77             if(dis[i] < val && vis[i] == 0) {
             78                 val = dis[i],idx = i;
             79             }
             80         }
             81         if(idx == 0) {
             82             return false;
             83         }
             84         vis[idx] = 1;
             85         for(i = 1;i <= n;i++) {
             86             if(vis[i] == false && g[idx][i] < inf){
             87                 int tmp =time2go(idx,i,dis[idx],0);
             88                 if(tmp < inf) {
             89                     int wei =tmp + g[idx][i];
             90                     if (dis[i] > wei) {
             91                         dis[i] = wei;
             92                         pre[i] = idx;
             93                     }
             94                 }
             95             }
             96         }
             97     }
             98 
             99     if(dis[dest] >= inf) {
            100         return false;
            101     }else {
            102         printf("%d\n",dis[dest]); top = 0;
            103         int tmp = dest;
            104         while(tmp > 0) {
            105             out[top++= tmp;
            106             tmp = pre[tmp];
            107         }
            108         for(i = top - 1;i > 0;i--) {
            109             printf("%d ",out[i]);
            110         }
            111         printf("%d\n",out[0]);
            112     }
            113     return true;
            114 }
            115 
            116 int main()
            117 {
            118     int i,j,k;
            119     char s[16];
            120     scanf("%d%d",&src,&dest);
            121     scanf("%d%d",&n,&m);
            122     for(i = 1;i <= n;i++) {
            123         scanf("%s %d %d %d\n",s,&jun[i].rt,&jun[i].tb,&jun[i].tp);
            124         jun[i].isblue = (s[0== 'B');
            125     }
            126     for(i = 1;i <= n;i++) {
            127         for(j = 1;j <= n;j++) {
            128             g[i][j] = inf;
            129         }
            130     }
            131     for(i = 0;i < m;i++) {
            132         int a,b,c;
            133         scanf("%d%d%d",&a,&b,&c);
            134         g[a][b] = g[b][a] = c;
            135     }
            136     if(dijkstra() == false) {
            137         printf("0\n");
            138     }
            139     return 0;
            140 }
            141 

            posted on 2009-12-04 20:58 schindlerlee 閱讀(1032) 評論(2)  編輯 收藏 引用 所屬分類: 解題報告

            Feedback

            # re: 2009年12月4日星期五.sgu103 pku1158 2009-12-04 21:56 non

            我討厭解題  回復  更多評論   

            # re: 2009年12月4日星期五.sgu103 pku1158 2009-12-04 21:58 XinLi

            @non
            其實基本就是裸的dijkstra..  回復  更多評論   

            中文字幕亚洲综合久久菠萝蜜| 久久精品人人做人人妻人人玩| AV无码久久久久不卡蜜桃| 国产精品一区二区久久不卡| 久久线看观看精品香蕉国产| 无码人妻久久久一区二区三区 | 91精品国产高清久久久久久io| 久久激情亚洲精品无码?V| 色婷婷噜噜久久国产精品12p | 久久性生大片免费观看性| 人妻无码αv中文字幕久久| 欧美麻豆久久久久久中文| 久久亚洲精品成人无码网站| 国产激情久久久久影院老熟女| 无码AV波多野结衣久久| 精品国产婷婷久久久| 久久精品视频网| 精品久久久久久无码中文字幕一区| 国产成人综合久久精品尤物| 精品久久久久久无码中文字幕一区| 久久天天躁狠狠躁夜夜2020| 久久国产精品久久精品国产| 亚洲AV日韩AV天堂久久| 污污内射久久一区二区欧美日韩 | 久久人人爽人人爽人人片AV不 | 91精品国产综合久久婷婷| 亚洲欧洲精品成人久久奇米网| 久久99精品国产麻豆蜜芽| 99久久国产热无码精品免费| 日本久久久久亚洲中字幕 | 一本色道久久88精品综合| 99久久免费国产精品特黄| 久久久久国产日韩精品网站| 成人精品一区二区久久| 亚洲国产精品婷婷久久| 久久久噜噜噜久久| 777久久精品一区二区三区无码| 成人国内精品久久久久影院| 久久久久久午夜成人影院| 久久亚洲精品国产精品| 麻豆成人久久精品二区三区免费|