青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

oyjpArt ACM/ICPC算法程序設計空間

// I am new in programming, welcome to my blog
I am oyjpart(alpc12, 四城)
posts - 224, comments - 694, trackbacks - 0, articles - 6

PKU1734 Sightseeing trip (CEOI99)

Posted on 2007-05-28 23:41 oyjpart 閱讀(2398) 評論(3)  編輯 收藏 引用 所屬分類: ACM/ICPC或其他比賽
很久沒寫結題報告了
今天做Sightseeing trip 上來貼個
Ural:1004

Sightseeing trip
Time Limit:1000MS  Memory Limit:65536K
Total Submit:317 Accepted:133 Special Judged

Description
There is a travel agency in Adelton town on Zanzibar island. It has decided to offer its clients, besides many other attractions, sightseeing the town. To earn as much as possible from this attraction, the agency has accepted a shrewd decision: it is necessary to find the shortest route which begins and ends at the same place. Your task is to write a program which finds such a route.

In the town there are N crossing points numbered from 1 to N and M two-way roads numbered from 1 to M. Two crossing points can be connected by multiple roads, but no road connects a crossing point with itself. Each sightseeing route is a sequence of road numbers y_1, ..., y_k, k>2. The road y_i (1<=i<=k-1) connects crossing points x_i and x_{i+1}, the road y_k connects crossing points x_k and x_1. All the numbers x_1,...,x_k should be different.The length of the sightseeing route is the sum of the lengths of all roads on the sightseeing route, i.e. L(y_1)+L(y_2)+...+L(y_k) where L(y_i) is the length of the road y_i (1<=i<=k). Your program has to find such a sightseeing route, the length of which is minimal, or to specify that it is not possible,because there is no sightseeing route in the town.

Input
The first line of input contains two positive integers: the number of crossing points N<=100 and the number of roads M<=10000. Each of the next M lines describes one road. It contains 3 positive integers: the number of its first crossing point, the number of the second one, and the length of the road (a positive integer less than 500).

Output
There is only one line in output. It contains either a string 'No solution.' in case there isn't any sightseeing route, or it contains the numbers of all crossing points on the shortest sightseeing route in the order how to pass them (i.e. the numbers x_1 to x_k from our definition of a sightseeing route), separated by single spaces. If there are multiple sightseeing routes of the minimal length, you can output any one of them.

Sample Input

5 7
1 4 1
1 3 300
3 1 10
1 2 16
2 3 100
2 5 15
5 3 20

 

Sample Output

1 3 5 2

 

點數是100個 題目意思是找一個最小權圈 以任意序輸出
從圖論的角度上考慮 應該是任意選一條邊(枚舉) 然后刪除邊 再以一個點為原點求Dijkstra 找出最小權圈 o(M*N^2)的復雜度 一個更加好的算法是限定枚舉的點為圈內序號最大的點 這樣就避免了對一個圈的多次枚舉(參考程序3)
如果直接搜就是任選一個點開始走回到原點則記錄長度 搜的時候必須要先對每個點的邊按照邊權進行排序 以備后面大量剪枝

程序1

 1//Solution
 2//by oyjpArt
 3//Algorithm:Search
 4#include <vector>
 5#include <iostream>
 6#include <algorithm>
 7using namespace std;
 8
 9const int N = 101;
10struct Node {int x, w; void set(int xx, int ww) {x =xx; w = ww; }};
11vector<Node> adj[N];
12int nv, ne, ans[N], na, S, rec[N];
13bool chk[N];
14int best;
15
16bool operator<(const Node& a, const Node& b) {
17 return a.w < b.w;
18}
19
20void search(int x, int sum, int depth, int father) {
21 int i;
22 if(x == S && chk[x]) {
23  if(sum < best) {
24   best = sum;  na = depth;
25   for(i = 0; i < depth; i++) ans[i] = rec[i];
26  }
27  return;
28 }
29 rec[depth] = x;
30 for(i = 0; i < adj[x].size(); ++i) if(adj[x][i].x != father) if(!chk[adj[x][i].x] || adj[x][i].x == S) {
31  chk[adj[x][i].x] = 1;
32  if(sum + adj[x][i].w < best) search(adj[x][i].x, sum + adj[x][i].w, depth+1, x);
33  chk[adj[x][i].x] = 0;
34 }
35
36
37int main() {
38 scanf("%d %d"&nv, &ne);
39 int i, u, v, w;
40 Node now;
41 for(i = 0; i < ne; i++) {
42  scanf("%d %d %d"&u, &v, &w);
43  --u; --v;
44  now.set(v, w);
45  adj[u].push_back(now);
46  now.x = u;
47  adj[v].push_back(now);
48 }
49 for(i = 0; i < nv; ++i) 
50  sort(adj[i].begin(), adj[i].end());
51 
52 best = 123456789;
53 for(i = 0; i < nv; ++i) {
54  memset(chk, 0, nv * sizeof(bool));
55  S = i;
56  search(i, 00-1);
57 }
58
59 if(best == 123456789) { printf("No solution.\n"); return 0; }
60 printf("%d", ans[0]+1);
61 for(i = 1; i < na; ++i) printf(" %d", ans[i]+1); putchar('\n');
62
63 return 0;
64}
65
66



程序2

 1//Solution
 2//by oyjpArt
 3//Algorithm : Enumerate + Dijkstra
 4#include <stdio.h>
 5#include <string.h>
 6
 7const int N = 101, M = 20001, MAXINT = 2000000000;
 8int ne, nv;
 9struct E {
10 int x, w; E* next;
11 void set(int xx, int ww, E* nn) {x = xx; w = ww; next = nn;}
12}e[M], * head[N];
13int best, dist[N], q[N], ans[N], pre[N], na;
14bool chk[N];
15
16void Dijk(int st, int endint ow) {
17 memset(chk, 0, sizeof(chk));
18 memset(dist, -1, sizeof(dist));
19 int qe = 1, qs = 0, i;
20 E * p;
21 for(i = 0; i < nv; ++i) if(i != st) {
22  for(p = head[st]; p != NULL; p = p->next) {
23   if(p->== i && p->> 0 && (dist[i] == -1 || dist[i] > p->w ) ) 
24    dist[i] = p->w;
25  }
26  if(dist[i] == -1) dist[i] = MAXINT;
27 }
28 q[0= st;
29 dist[st] = 0;
30 chk[st] = 1;
31 for(i = 0; i < nv; ++i) pre[i] = st;
32 pre[st] = -1;
33 while(qs < qe) {
34  int cur = q[qs++];
35  chk[cur] = 1;
36  if(ow + dist[cur] >= best) return;
37  if(cur == end) {
38   if(dist[end+ ow < best) {
39    na = 0;
40    for(i = cur; i != -1; i = pre[i]) ans[na++= i;
41    best = dist[end+ ow;
42   }
43   return;
44  }
45  int _min = MAXINT, mini = -1;
46  for(i = 0; i < nv; i++if(!chk[i]) {
47   if(dist[i] < _min) {
48    _min = dist[i];
49    mini = i;
50   }
51  }
52  if(mini == -1) return;
53  q[qe++= mini;
54  for(i = 0; i < nv; ++i) if(!chk[i]) {
55   for(p = head[mini]; p != NULL; p = p->nextif(p->== i)  break;
56   if(p == NULL) continue;
57   if(p->> 0 && p->+ dist[mini] < dist[i]) {
58    dist[i] = p->+ dist[mini];
59    pre[i] = mini;
60   }
61  }
62 }
63}
64
65int main() {
66 scanf("%d %d"&nv, &ne);
67 memset(head, NULL, nv * sizeof(E*));
68 int i, u, v, w;
69 for(i = 0; i < ne; ++i) {
70  scanf("%d %d %d"&u, &v, &w);
71  --u; --v;
72  e[2*i].set(u, w, head[v]);
73  head[v] = &e[2*i];
74  e[2*i+1].set(v, w, head[u]);
75  head[u] = &e[2*i+1];
76 }
77 E * p, * q;
78 best = MAXINT;
79 for(i = 0; i < nv; ++i) {
80  for(p = head[i]; p != NULL; p = p->next) {
81   int w = p->w;
82   int j = p->x;
83   for(q = head[i]; q != NULL; q = q->nextif(q->== j) q->= -q->w;
84   for(q = head[j]; q != NULL; q = q->nextif(q->== i) q->= -q->w;
85   Dijk(i, j, w);
86   for(q = head[i]; q != NULL; q = q->nextif(q->== j) q->= -q->w;
87   for(q = head[j]; q != NULL; q = q->nextif(q->== i) q->= -q->w;
88  }
89 }
90 if(best == MAXINT) printf("No solution.\n");
91 else {
92  printf("%d", ans[0+ 1);
93  for(i = 1; i < na; ++i) printf(" %d", ans[i] + 1); putchar('\n');
94 }
95 return 0;
96}
97//唉 不用vector代碼量增大好多。。暈倒
98

程序3:
經wywcgs大牛提醒 改寫成了Floyd程序 時間銳減
 1#include <stdio.h>
 2#include <string.h>
 3
 4const int N = 101;
 5const int MAXINT = 123456789;
 6int ne, nv;
 7int adj[N][N];
 8int pre[N][N];
 9int conn[N][N];
10int na, ans[N];
11int best;
12
13void floyd() {
14    int i, j, k, tmp, p;
15    for(k = 0; k < nv; ++k) {
16        for(i = 0; i < k; ++i) {
17            for(j = 0; j < k; ++j) if(conn[i][k] && conn[k][j] && j != i) {
18                if( (tmp = adj[i][j] + conn[k][i] + conn[j][k]) < best) {
19                    best = tmp;
20                    na = 1; ans[0= k; p = i;
21                    while(p != -1) {
22                        ans[na++= p;
23                        p = pre[p][j];
24                    }
25                }
26            } 
27        }
28        for(i = 0; i < nv; ++i) 
29            for(j = 0; j < nv; ++j) {
30                if(adj[i][j] > adj[i][k] + adj[k][j]) {
31                    adj[i][j] = adj[i][k] + adj[k][j];
32                    pre[i][j] = pre[i][k];
33                }
34            }
35    }
36}
37
38int main() {
39    int i, j, u, v, w;
40    memset(pre, -1, sizeof(pre));
41    scanf("%d %d"&nv, &ne);
42    for(i = 0; i < nv; ++i) {
43        for(j = i+1; j < nv; ++j) 
44            adj[i][j] = adj[j][i] = MAXINT;
45        adj[i][i] = 0;
46    }
47    for(i = 0; i < ne; ++i) {
48        scanf("%d %d %d"&u, &v, &w);
49        --u; --v;
50        if(w < adj[u][v])     
51            conn[u][v] = conn[v][u] = adj[u][v] = adj[v][u] = w;
52        pre[u][v] = v, pre[v][u] = u;
53    }
54    best = MAXINT;
55    floyd();
56    if(best == MAXINT) printf("No solution.\n");
57    else {
58        for(i = 0; i < na; ++i) {
59            printf("%d", ans[i] + 1);
60            if(i != na-1) putchar(' ');
61            else putchar('\n');
62        }
63    }
64
65    return 0;
66}
67

Feedback

# re: PKU1734 Sightseeing trip (CEOI99)  回復  更多評論   

2007-05-30 22:08 by wywcgs
呃……這道題有O(V^3)做法……一次floyd或者V次dijkstra……
你可以再想想,總之不是很難……

# re: PKU1734 Sightseeing trip (CEOI99)  回復  更多評論   

2007-07-28 17:27 by dingyihamigua
大牛人啊!!
很經典的東西!!
謝謝了哈!
辛苦了!!

# re: PKU1734 Sightseeing trip (CEOI99)  回復  更多評論   

2011-11-10 15:58 by wuyiqi
我感覺如果用搜索的話好像排序與不排序是一樣的吧,因為一個點是等可能的搜向鄰邊的,排序改變不了什么,就算先搜到最短的鄰邊,隨后還是有可能越走越遠
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            免费亚洲一区二区| 亚洲国产精品成人| 欧美一级大片在线观看| 亚洲尤物视频在线| 亚洲一区二区三区涩| 亚洲视频免费在线| 亚洲欧美精品一区| 欧美中文字幕不卡| 久久久久久久一区二区| 久热精品视频在线免费观看| 久久午夜精品| 牛人盗摄一区二区三区视频| 欧美激情欧美狂野欧美精品| 欧美国产一区二区三区激情无套| 亚洲第一网站| 日韩视频免费在线观看| 亚洲一区不卡| 欧美在线视频全部完| 久久欧美中文字幕| 欧美第十八页| 欧美午夜精品一区| 国产一区二区三区久久悠悠色av| 精品电影在线观看| 亚洲美女少妇无套啪啪呻吟| 亚洲天堂av在线免费| 午夜精品一区二区在线观看 | 一区视频在线播放| 亚洲第一色在线| 9久re热视频在线精品| 亚洲欧美在线一区二区| 一区二区自拍| 99xxxx成人网| 欧美一区2区三区4区公司二百| 久久久久成人精品| 亚洲国产视频一区| 亚洲一级黄色av| 久久一区二区三区四区| 欧美日韩免费观看一区| 国语自产在线不卡| 一区二区日韩伦理片| 小嫩嫩精品导航| 欧美福利一区二区| 亚洲一区在线播放| 欧美aaaaaaaa牛牛影院| 国产精品欧美日韩久久| 在线观看欧美日韩国产| 亚洲一区二区三区成人在线视频精品| 黄色日韩在线| 亚洲一区二区三区国产| 久久综合婷婷| 一区二区三区蜜桃网| 久久嫩草精品久久久久| 国产精品极品美女粉嫩高清在线 | 国产精品老牛| 亚洲国产日韩一区二区| 久久国产视频网站| 亚洲一区国产一区| 欧美成人免费全部| 亚洲一品av免费观看| 欧美1区2区视频| 国产一区二区丝袜高跟鞋图片 | 欧美韩国在线| 国产一级揄自揄精品视频| 在线亚洲欧美| 欧美福利电影网| 久久aⅴ国产欧美74aaa| 性视频1819p久久| 欧美日韩在线高清| 亚洲高清免费视频| 久久爱另类一区二区小说| 亚洲精品一区二区在线| 快射av在线播放一区| 国产色爱av资源综合区| 亚洲一区欧美| 日韩午夜激情| 欧美激情按摩在线| 亚洲黄色在线看| 亚洲国产一区二区三区青草影视| 欧美一区二区久久久| 99re热这里只有精品免费视频| 牛人盗摄一区二区三区视频| 激情视频亚洲| 久久在线播放| 欧美一区二区高清在线观看| 国产精品久久久久一区二区三区| 日韩网站在线看片你懂的| 欧美高清在线精品一区| 久久久精彩视频| 国产欧美一区二区精品性色| 国产女主播一区二区| 亚洲欧美日本精品| av成人天堂| 欧美少妇一区二区| 一本一本a久久| 亚洲精品少妇| 欧美另类69精品久久久久9999| 亚洲国产高清aⅴ视频| 可以免费看不卡的av网站| 久久疯狂做爰流白浆xx| 国内欧美视频一区二区| 久久久噜噜噜久久中文字免| 老司机一区二区| 久久久噜噜噜久久狠狠50岁| 狠狠综合久久av一区二区老牛| 久久午夜视频| 美女999久久久精品视频| 亚洲人被黑人高潮完整版| 亚洲福利免费| 欧美日本一区二区三区| 亚洲一本大道在线| 亚洲永久免费精品| 国精品一区二区| 免费成人高清| 欧美激情中文字幕一区二区| 国产精品久久国产三级国电话系列| 国产精品99久久久久久有的能看| 99在线精品观看| 国产精品亚洲综合久久| 久久精品一区四区| 久久综合中文色婷婷| 亚洲高清在线精品| 亚洲精品偷拍| 国产精品亚洲不卡a| 久久影院亚洲| 欧美人与性禽动交情品 | 欧美人与性动交cc0o| 亚洲欧美视频一区| 久久精品在线观看| 亚洲精品在线视频观看| 一本久久综合亚洲鲁鲁| 国产欧美 在线欧美| 蜜桃久久av一区| 欧美人与禽猛交乱配| 欧美在线视频不卡| 久久综合给合久久狠狠色 | 欧美综合第一页| 亚洲人在线视频| 亚洲视频在线二区| 在线观看一区| 亚洲天堂av高清| 亚洲高清自拍| 亚洲男人的天堂在线观看| 尹人成人综合网| 夜夜嗨av色综合久久久综合网| 国产欧美日韩亚洲精品| 欧美激情国产日韩精品一区18| 欧美午夜精品电影| 噜噜噜91成人网| 欧美日韩一区二区三区在线观看免| 久久大逼视频| 欧美日本中文字幕| 久久久亚洲精品一区二区三区| 欧美激情一区二区三区在线视频观看| 欧美一区二区福利在线| 欧美大片91| 久久久久久综合| 欧美三级电影大全| 欧美国产精品久久| 国产精品一区二区久久久久| 亚洲盗摄视频| 国产真实久久| 在线视频日韩| 亚洲日本久久| 久久av一区| 午夜视频久久久| 99精品久久久| 亚洲国产精品成人精品| 午夜精品亚洲一区二区三区嫩草| 亚洲精品社区| 久久嫩草精品久久久久| 欧美专区在线| 国产精品国产三级国产aⅴ浪潮 | 亚洲精品一区二区三区四区高清 | 欧美激情影音先锋| 你懂的视频欧美| 国产私拍一区| 亚洲影院在线| 亚洲一二三区在线| 欧美国产精品v| 欧美肥婆bbw| 亚洲国产激情| 欧美国产91| 在线观看91精品国产入口| 欧美一激情一区二区三区| 亚洲在线1234| 欧美日韩中文在线观看| 欧美激情日韩| 亚洲国产mv| 久久资源在线| 蜜臀a∨国产成人精品| 国语自产偷拍精品视频偷 | 999亚洲国产精| 嫩模写真一区二区三区三州| 亚洲国产成人一区| 久久一区欧美| 欧美99在线视频观看| 精品动漫av| 麻豆久久精品| 欧美激情aⅴ一区二区三区| 一区二区在线观看av|