【歐拉路】售貨員的難題
阿新 • • 發佈:2019-03-02
sca 存在 mes ace scanf 結點 scan turn str
無向圖and歐拉路
歐拉路存在條件:
1、圖是連通的
2、最多只能有兩個度數為奇數的結點
#include<bits/stdc++.h> using namespace std; int num; int cnt; int n,m,t; int du[1005]; int vis[1005]; int head[1005]; struct Edge { int to,nxt; }; Edge e[500000]; set<int>s; void add(int x,int y) { e[cnt].to=y; e[cnt].nxt=head[x]; head[x]=cnt++; } void dfs(int u) { num+=(du[u]&1); for(int i=head[u];i!=-1;i=e[i].nxt) { int v=e[i].to; if(!vis[v]) {vis[v]=1;dfs(v);} } } int main() { int a,b,cas=0; while(scanf("%d%d%d",&n,&m,&t)&&(n+m+t)) { cnt=0; s.clear(); memset(head,-1,sizeof(head)); memset(du,0,sizeof(du)); for(int i=0;i<=m-1;++i) { scanf("%d%d",&a,&b); add(a,b);add(b,a); s.insert(a);s.insert(b); du[a]++;du[b]++; } num=0; memset(vis,0,sizeof(vis)); for(set<int>::iterator it=s.begin();it!=s.end();++it) { if(!vis[*it]) { int temp=num; vis[*it]=1; dfs(*it); if(temp+2>num) num=temp+2; } } printf("Case %d: %d\n",++cas,(max(0,(num-2)/2)+m)*t); } return 0; }
【歐拉路】售貨員的難題