#include<iostream>usingnamespace std;constint N =210;int n, m;int nodes[N *2], cnt;bool g[N][N];bool st[N];boolcheck(){if(cnt != n +1|| nodes[0]!= nodes[cnt -1])returnfalse;for(int i =1; i <= n; i ++) st[i]=0;for(int i =0; i < cnt -1; i ++){st[nodes[i]]=true;if(!g[nodes[i]][nodes[i +1]])returnfalse;}for(int i =1; i <= n; i ++)if(!st[i])returnfalse;returntrue;}intmain(){scanf("%d%d",&n,&m);int a, b;while(m --){scanf("%d%d",&a,&b);g[a][b]= g[b][a]=true;}int k;scanf("%d",&k);while(k --){scanf("%d",&cnt);for(int i =0; i < cnt; i ++)scanf("%d",&nodes[i]);if(check())puts("YES");elseputs("NO");}}
#include<iostream>usingnamespace std;constint N =510;int n, m;bool g[N][N];int d[N];bool st[N];// dfs用intdfs(int u){st[u]=true;int cnt =1;for(int i =1; i <= n; i ++){if(!st[i]&& g[u][i])cnt +=dfs(i);}return cnt;}intmain(){scanf("%d%d",&n,&m);int a, b;while(m --){scanf("%d%d",&a,&b);g[a][b]= g[b][a]=true;d[a]++, d[b]++;}int cnt =dfs(1);printf("%d", d[1]);for(int i =2; i <= n; i ++)printf(" %d", d[i]);puts("");if(cnt == n){int s =0;for(int i =1; i <= n; i ++)if(d[i]%2)s ++;if(!s)puts("Eulerian");elseif(s ==2)puts("Semi-Eulerian");elseputs("Non-Eulerian");}elseputs("Non-Eulerian");}
#include<iostream>#include<cstring>usingnamespace std;constint N =10010;int n, m;structEdge{int a, b;}e[N];bool st[N];intmain(){cin >> n >> m;for(int i =0; i < m; i ++) cin >> e[i].a >> e[i].b;int k;cin >> k;while(k --){int cnt;cin >> cnt;memset(st,0,sizeof st);while(cnt --){int x;cin >> x;st[x]=true;}int i;for(i =0; i < m; i ++)if(!st[e[i].a]&&!st[e[i].b])break;if(i == m)puts("Yes");elseputs("No");}return0;}
#include<iostream>#include<cstring>usingnamespace std;constint N =210;int n, m;bool g[N][N];int nodes[N], cnt;bool st[N];boolcheck_clique(){for(int i =0; i < cnt; i ++)for(int j =0; j < i; j ++)if(!g[nodes[i]][nodes[j]])returnfalse;returntrue;}boolcheck_maximum(){memset(st,0,sizeof st);for(int i =0; i < cnt; i ++)st[nodes[i]]=true;for(int i =1; i <= n; i ++){if(!st[i]){bool success =false;for(int j =0; j < cnt; j ++)if(!g[i][nodes[j]]){success =true;break;}if(!success)returnfalse;}}returntrue;}intmain(){scanf("%d%d",&n,&m);int a, b;while(m --){scanf("%d%d",&a,&b);g[a][b]= g[b][a]=true;}int k;scanf("%d",&k);while(k --){scanf("%d",&cnt);for(int i =0; i < cnt; i ++)scanf("%d",&nodes[i]);if(check_clique()){if(check_maximum())puts("Yes");elseputs("Not Maximal");}elseputs("Not a Clique");}}
1146 Topological Order (25 分)
題意 :
以下哪個選項不是從給定的有向圖中獲得的拓撲序列?
現(xiàn)在,請你編寫一個程序來測試每個選項。
思路 :
將輸入的每一條邊存下來
對于每對詢問,遍歷每條邊,如果邊的起點比邊的終點在詢問中出現(xiàn)的位置晚,說明詢問不合格
語法 :
is_first的使用,如果是true,將其轉(zhuǎn)為false;否則輸出空格
#include<iostream>#include<cstring>usingnamespace std;constint N =1010, M =10010;int n, m;structEdge{int a, b;}e[M];int p[N];intmain(){cin >> n >> m;for(int i =0; i < m; i ++) cin >> e[i].a >> e[i].b;int k;cin >> k;bool is_first =true;for(int i =0; i < k; i ++){for(int j =1; j <= n; j ++){int x;cin >> x;p[x]= j;}bool success =true;for(int j =0; j < m; j ++)if(p[e[j].a]> p[e[j].b]){success =false;break;}if(!success){if(is_first) is_first =false;else cout <<' ';cout << i;}}cout << endl;return0;}
#include<iostream>#include<cstring>usingnamespace std;constint N =210, INF =0x3f3f3f3f;int n, m;int d[N][N], vers[310];bool st[N];intmain(){cin >> n >> m;memset(d,0x3f,sizeof d);for(int i =0; i < m; i ++){int a, b, c;cin >> a >> b >> c;d[a][b]= d[b][a]= c;}int k;cin >> k;int min_dist = INF, min_id;for(int T =1; T <= k; T ++){int cnt;cin >> cnt;for(int i =0; i < cnt; i ++) cin >> vers[i];int sum =0;bool success =true;memset(st,0,sizeof st);for(int i =0; i +1< cnt; i ++){int a = vers[i], b = vers[i +1];if(d[a][b]== INF){sum =-1;success =false;break;}else sum += d[a][b];st[a]=true;}for(int i =1; i <= n; i ++)if(!st[i]){success =false;break;}if(vers[0]!= vers[cnt -1]) success =false;if(sum ==-1)printf("Path %d: NA (Not a TS cycle)\n", T);else{if(!success)printf("Path %d: %d (Not a TS cycle)\n", T, sum);else{if(cnt == n +1)printf("Path %d: %d (TS simple cycle)\n", T, sum);elseprintf("Path %d: %d (TS cycle)\n", T, sum);if(min_dist > sum){min_dist = sum;min_id = T;}}}}printf("Shortest Dist(%d) = %d\n", min_id, min_dist);return0;}
1154 Vertex Coloring (25 分)
題意 :
一個合適的頂點著色是指用各種顏色標記圖中各個頂點,使得每條邊的兩個端點的顏色都不相同。
如果一種合適的頂點著色方案使用了一共 k 種不同的顏色,則稱其為合適的 k 著色(k-coloring)。
#include<iostream>#include<cstring>#include<unordered_set>usingnamespace std;constint N =10010;int n, m;structEdge{int a, b;}e[N];int color[N];intmain(){cin >> n >> m;for(int i =0; i < m; i ++) cin >> e[i].a >> e[i].b;int k;cin >> k;while(k --){for(int i =0; i < n; i ++) cin >> color[i];bool success =true;for(int i =0; i < m; i ++)if(color[e[i].a]== color[e[i].b]){success =false;break;}if(success){unordered_set<int> S;for(int i =0; i < n; i ++) S.insert(color[i]);printf("%d-coloring\n", S.size());}elseputs("No");}return0;}與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖